【发布时间】:2011-07-09 06:00:52
【问题描述】:
下面的代码说明了 destruct() 被调用了两次。我想知道为什么?
class A {
function hi(){ echo 'hi'; }
function __destruct(){
echo 'destroy';
}
}
class B{
public $this_ = '';
function __construct(){
$this->this_ = new A;
}
function __call($method, $params) {
return call_user_func_array(array($this->this_, $method), $params);
}
}
$b = new B;
$b->__destruct();
输出:
destroydestroy
编辑
zneak 和 TomcatExodus 都是正确的。如果我只是:
[..code..]
$b = new B;
$b->__destruct();
print 'end of script';
输出将显示:
destroyend of scriptdestroy
【问题讨论】:
-
嗯,我没有注意到 B 没有扩展 A。我认为它可能正在调用您调用它的实例中包含的每个对象的析构函数。
-
@TomcatExodus:这不是错字。 OP 说在 B 上调用 destruct 是在 A 属性上调用它。
-
@BoltClock;是的,实现并删除了评论。刚刚测试,由于类
B创建了类A的实例,并且B也使用__call()路由到自包含的A对象,因此__destruct()对B的调用被路由到A的自包含实例。在脚本终止时,所有对象都会离开内存,A对象会再次触发 destruct。我相信我们的答案仍然正确,只是情况有所不同。 -
@TomcatExodus:该死的魔法方法! :)
标签: php oop destructor