SplQueue
erbt von SplDoublyLinkedList
. Keine dieser Klassen definiert einen eigenen Konstruktor. Daher gibt es keinen expliziten übergeordneten Konstruktor, der aufgerufen wird, und Sie erhalten einen solchen Fehler. Die Dokumentation ist ein wenig irreführend (wie es für viele SPL-Klassen ist).
Um den Fehler zu beheben, rufen Sie nicht den übergeordneten Konstruktor auf.
, nun in den meisten objektorientierten Sprachen, werden Sie die Standardkonstruktors erwarten genannt zu werden, wenn es nicht explizit Konstruktor in einer Klasse deklariert ist. Aber hier ist der Haken: PHP-Klassen haben keine Standardkonstruktoren! Eine Klasse hat einen Konstruktor wenn und nur wenn man definiert ist.
In der Tat, Reflexion mit der stdClass
Klasse zu analysieren, sehen wir auch, dass ein Konstruktor fehlt:
$c = new ReflectionClass('stdClass');
var_dump($c->getConstructor()); // NULL
Versuch, die Konstrukteure von SplQueue
und SplDoublyLinkedList
beide ergeben NULL
als auch zu reflektieren.
Meine Vermutung ist, dass, wenn Sie PHP sagen, eine Klasse zu instanziieren, es die ganze interne Speicherzuweisung führt er für das neue Objekt braucht, sucht dann nach einem Konstruktor Definition und nennt es nur, wenn eine Definition von __construct()
oder <class name>()
gefunden. Ich habe mir den Quellcode angesehen und es scheint, dass PHP einfach ausrastet und stirbt, wenn es keinen Konstruktor zum Aufruf findet, weil Sie es explizit in einer Unterklasse angegeben haben (siehe zend_vm_def.h
).
Nur aus Neugier, warum erweitern Sie die Warteschlange Klasse? Was brauchst du, um dieses Dekorieren nicht zu machen? – ircmaxell