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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
21
0
5 106
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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();
?>
Ответ принят как подходящий

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

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

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

Это хорошее завершение моего ответа. +1 для вас :)

Mark Biek 23.10.2008 21:21

Другие вопросы по теме