SplQueue
được kế thừa từ SplDoublyLinkedList
. Cả hai lớp này không định nghĩa một hàm tạo riêng của nó. Do đó không có hàm khởi tạo cha mẹ rõ ràng nào để gọi và bạn nhận được một lỗi như vậy. Tài liệu này có chút ít gây hiểu nhầm về vấn đề này (vì nó dành cho nhiều lớp SPL).
Để giải quyết lỗi, không gọi hàm khởi tạo gốc.
Bây giờ, trong hầu hết các ngôn ngữ hướng đối tượng, bạn sẽ mong đợi mặc định constructor được gọi là nếu không có một nhà xây dựng rõ ràng tuyên bố trong một lớp học. Nhưng đây là bắt: Các lớp PHP không có các hàm tạo mặc định! Một lớp có một hàm tạo nếu và chỉ khi một được xác định.
Trong thực tế, sử dụng phản chiếu để phân tích các lớp stdClass
, chúng ta thấy thậm chí thiếu một constructor:
$c = new ReflectionClass('stdClass');
var_dump($c->getConstructor()); // NULL
Cố gắng để phản ánh các nhà thầu của SplQueue
và SplDoublyLinkedList
cả mang lại NULL
là tốt.
tôi đoán là khi bạn nói với PHP để thuyết minh một lớp, nó thực hiện tất cả các phân bổ bộ nhớ cần thiết cho các đối tượng mới, sau đó tìm kiếm một định nghĩa constructor và gọi đó là chỉ khi một định nghĩa của __construct()
hoặc <class name>()
được tìm thấy. Tôi đã đi để xem xét mã nguồn, và có vẻ như PHP chỉ freaks ra và chết khi nó không thể tìm thấy một nhà xây dựng để gọi bởi vì bạn nói với nó một cách rõ ràng để trong một phân lớp (xem zend_vm_def.h
).
Chỉ vì tò mò, tại sao bạn mở rộng lớp xếp hàng? Những gì bạn cần để làm trang trí đó sẽ không? – ircmaxell