PHP 的__destruct可见性

2022-08-30 19:08:38

函数的“可见性”应该是公开的还是其他的?我正在尝试为我的团队编写一个标准文档,但这个问题出现了。__destruct()


答案 1

除了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的优秀例子!


答案 2

我认为在子类需要显式调用父类的__destruct方法的情况下,它需要是公开的。

像这样的东西会抛出一个错误:

<?php
class MyParent
{
    private function __destruct()
    {
        echo 'Parent::__destruct';
    }
}

class MyChild extends MyParent
{
    function __destruct()
    {
        echo 'Child::__destruct';
        parent::__destruct();
    }
}

$myChild = new MyChild();
?>

推荐