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