21

関数の「可視性」は__destruct()パブリックにする必要がありますか? 私は自分のグループの標準ドキュメントを書こうとしていますが、この質問が出てきました。

4

2 に答える 2

27

Mark Biekの答えに加えて:

__destruct()関数はパブリックとして宣言する必要があります。そうしないと、スクリプトのシャットダウン時に関数が実行されません。

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 に答える