“__destruct()”函数的“visibility”应该是公共的还是其他什么?我正在为我的团队编写一个标准文档,这个问题浮现了出来。
“__destruct()”函数的“visibility”应该是公共的还是其他什么?我正在为我的团队编写一个标准文档,这个问题浮现了出来。
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提供的优秀示例!
如果子类需要显式调用父类的__destruct方法,那么它需要是公共的。
以下代码将会抛出错误:
<?php
class MyParent
{
private function __destruct()
{
echo 'Parent::__destruct';
}
}
class MyChild extends MyParent
{
function __destruct()
{
echo 'Child::__destruct';
parent::__destruct();
}
}
$myChild = new MyChild();
?>