PHP中的__destruct可见性问题

23

“__destruct()”函数的“visibility”应该是公共的还是其他什么?我正在为我的团队编写一个标准文档,这个问题浮现了出来。

2个回答

29
除了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提供的优秀示例!


1
这是对我的回答很好的补充。给你点赞(+1)! :) - Mark Biek

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();
?>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接