Должна ли "видимость" для функции __destruct()
быть открытой или что-то еще? Я пытаюсь написать стандартную документацию для своей группы, и этот вопрос возник.
__destruct видимость для PHP
Ответ 1
В дополнение к ответу Марка Бика:
Функция __destruct() должна быть объявлена общедоступной. В противном случае функция не будет выполнена при завершении script:
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();
?>