Ton*_*Gee 28 php oop spl constructor
我正在扩展其中一个SPL(标准PHP库)类,我无法调用父的构造函数.这是我得到的错误:
致命错误:无法调用构造函数
以下是该SplQueue文档的链接:http://www.php.net/manual/en/class.splqueue.php
这是我的代码:
$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;
Run Code Online (Sandbox Code Playgroud)
什么可以阻止我调用父的构造函数?
Bol*_*ock 45
SplQueue继承自SplDoublyLinkedList.这些类都没有定义自己的构造函数.因此,没有明确的父构造函数可以调用,而且会出现这样的错误.文档在这个文档上有点误导(就像许多SPL类一样).
要解决该错误,请不要调用父构造函数.
现在,在大多数面向对象的语言中,如果没有在类中声明的显式构造函数,您将期望调用默认构造函数.但这里有一个问题:PHP类没有默认的构造函数!当且仅当定义了一个类时,类具有构造函数.
事实上,使用反射来分析stdClass类,我们甚至看到缺少构造函数:
$c = new ReflectionClass('stdClass');
var_dump($c->getConstructor()); // NULL
Run Code Online (Sandbox Code Playgroud)
试图反映构造函数SplQueue和SplDoublyLinkedList两者的收益率NULL.
我的猜测是,当你告诉PHP实例化一个类,它执行所有它需要为新对象的内部内存分配,然后寻找一个构造函数的定义,并调用它只有一个定义__construct()或<class name>()发现.我去看了一下源代码,看起来PHP只是因为你在子类中明确地告诉它而无法找到构造函数而死了并且死了(参见参考资料zend_vm_def.h).
| 归档时间: |
|
| 查看次数: |
22103 次 |
| 最近记录: |