为什么我在调用父级构造函数时收到致命错误?

2022-08-30 13:34:05

我正在扩展一个SPL(标准PHP库)类,我无法调用父级的构造函数。这是我遇到的错误:

致命错误: 无法调用构造函数

以下是 的文档链接:http://www.php.net/manual/en/class.splqueue.phpSplQueue

这是我的代码:

$queue = new Queue();

class Queue extends SplQueue {

    public function __construct() {
        echo 'before';
        parent::__construct();
        echo 'I have made it after the parent constructor call';
    }

}

exit;

什么可以阻止我调用父级的构造函数?


答案 1

SplQueue继承自 。这两个类都没有定义自己的构造函数。因此,没有要调用的显式父构造函数,并且您会收到这样的错误。文档在这个问题上有点误导(因为它适用于许多SPL类)。SplDoublyLinkedList

若要解决该错误,请不要调用父构造函数。


现在,在大多数面向对象的语言中,如果没有在类中声明显式构造函数,您将期望调用默认构造函数。但问题是:PHP类没有默认的构造函数!当且仅当定义了一个构造函数时,类才具有构造函数。

事实上,使用反射来分析类,我们看到甚至缺少构造函数:stdClass

$c = new ReflectionClass('stdClass');
var_dump($c->getConstructor()); // NULL

试图反映 和 的构造函数 也会产生收益。SplQueueSplDoublyLinkedListNULL

我的猜测是,当你告诉PHP实例化一个类时,它会执行新对象所需的所有内部内存分配,然后寻找构造函数定义,并且只有在找到或的定义时才调用它。我去看了一下源代码,似乎PHP只是在找不到要调用的构造函数时惊慌失措并死亡,因为你在子类中明确告诉它(请参阅)。__construct()<class name>()zend_vm_def.h


答案 2

通常,当 中引用的类实际上没有函数时,会引发此错误。parentparent::__construct()__construct()


推荐