__destruct видимость для PHP - PullRequest
       17

__destruct видимость для PHP

19 голосов
/ 23 октября 2008

Должна ли "видимость" для функции __destruct() быть публичной или что-то еще? Я пытаюсь написать стандартную документацию для своей группы, и этот вопрос возник.

Ответы [ 2 ]

24 голосов
/ 23 октября 2008

В дополнение к ответу Марка Бика:

Функция __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

(Спасибо Марку Биеку за отличный пример!)

9 голосов
/ 23 октября 2008

Я думаю, что он должен быть публичным в том случае, если подкласс должен явно вызвать метод __ destruct родительского класса.

Что-то вроде этого выдаст ошибку:

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

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

$myChild = new MyChild();
?>
...