该功能的“可见性”应该__destruct()
是公开的还是其他的?我正在尝试为我的团队编写标准文档,但出现了这个问题。
问问题
5296 次
2 回答
27
除了 Mark Biek 的回答:
__destruct() 函数必须声明为 public。否则,该函数将不会在脚本关闭时执行:
Warning: Call to protected MyChild1::__destruct() from context '' during shutdown ignored in Unknown on line 0
Warning: Call to private MyChild2::__destruct() from context '' during shutdown ignored in Unknown on line 0
这可能不是有害的,而是不洁的。
但最重要的是:如果析构函数被声明为私有或受保护的,则运行时将在垃圾收集器尝试释放对象的那一刻抛出一个致命错误:
<?php
class MyParent
{
private function __destruct()
{
echo 'Parent::__destruct';
}
}
class MyChild extends MyParent
{
private function __destruct()
{
echo 'Child::__destruct';
parent::__destruct();
}
}
$myChild = new MyChild();
$myChild = null;
$myChild = new MyChild();
?>
输出
Fatal error: Call to private MyChild::__destruct() from context '' in D:\www\scratchbook\destruct.php on line 20
(感谢 Mark Biek 提供的出色示例!)
于 2008-10-23T16:13:55.220 回答
10
我认为在子类需要显式调用父类的__destruct方法的情况下,它需要是公共的。
这样的事情会引发错误:
<?php
class MyParent
{
private function __destruct()
{
echo 'Parent::__destruct';
}
}
class MyChild extends MyParent
{
function __destruct()
{
echo 'Child::__destruct';
parent::__destruct();
}
}
$myChild = new MyChild();
?>
于 2008-10-23T15:43:42.767 回答