SplQueue
следует от SplDoublyLinkedList
. Ни один из этих классов не определяет собственный конструктор. Поэтому нет явного родительского конструктора для вызова, и вы получаете такую ошибку. Документация немного вводит в заблуждение на этом (как и для многих классов SPL).
Чтобы решить эту ошибку, не вызывайте родительский конструктор.
Теперь, в большинстве объектно-ориентированных языков программирования, вы будете ожидать конструктор по умолчанию называться, если не явный конструктор, объявленный в классе. Но вот улов: PHP-классы не имеют конструкторов по умолчанию! Класс имеет конструктор тогда и только тогда, когда он определен.
В самом деле, с помощью отражения для анализа stdClass
класса, мы видим, даже то, что не хватает конструктора:
$c = new ReflectionClass('stdClass');
var_dump($c->getConstructor()); // NULL
Попытка отразить конструкторы SplQueue
и SplDoublyLinkedList
оба дают NULL
, а также.
Я думаю, что когда вы говорите PHP, чтобы создать экземпляр класса, он выполняет все внутренние выделения памяти, необходимые для нового объекта, а затем ищет определение конструктора и называет его только если определения __construct()
или <class name>()
найден. Я пошел взглянуть на исходный код, и кажется, что PHP просто волнуется и умирает, когда он не может найти конструктор для вызова, потому что вы явно сказали его в подклассе (см. zend_vm_def.h
).
Просто из любопытства, почему вы расширяете класс очереди? Что вам нужно сделать, чтобы украсить не будет? – ircmaxell