Деструктор (__destruct)
Часть раздела Объектно-ориентированное программирование путешествия по PHP на Coddy — урок 8 из 91.
Метод __destruct — это специальный метод, который автоматически вызывается при уничтожении объекта. Объект уничтожается, когда на него больше нет ссылок или когда выполнение скрипта завершается.
Вот пример класса, имеющего как конструктор, так и деструктор:
<?php
class Resource {
public $name;
public function __construct($name) {
$this->name = $name;
echo $this->name . " was created\n";
}
public function __destruct() {
echo $this->name . " was destroyed\n";
}
}Создайте объект и проследите за его жизненным циклом:
echo "=== Start ===\n";
$r = new Resource("Connection");
echo "Using " . $r->name . "\n";
unset($r); // явное уничтожение объекта
echo "=== End ===\n";Вывод:
=== Start ===
Connection was created
Using Connection
Connection was destroyed
=== End ===Функция unset() удаляет ссылку на объект, что приводит к немедленному вызову деструктора.
Если вы не вызовете unset(), деструктор запускается автоматически по завершении работы скрипта:
$r = new Resource("Logger");
echo "Working...\n";
// __destruct вызывается автоматически в конце скриптаВывод:
Logger was created
Working...
Logger was destroyedКлючевой момент: Метод __destruct полезен для задач очистки, таких как закрытие файлов, освобождение ресурсов или ведение логов, когда объект больше не нужен.
Задание
СреднеЗавершите класс Resource в resource.php:
- Добавьте метод
__construct, который принимает$name, устанавливает его как свойство и выводит"[name] was created" - Добавьте метод
logMessage, который принимает$messageи выводит"Log: [message]" - Добавьте метод
__destruct, который выводит"[name] was destroyed"
Файл driver.php будет тестировать жизненный цикл ваших объектов Resource.
Шпаргалка
Метод __destruct вызывается автоматически при уничтожении объекта (когда на него больше нет ссылок или когда выполнение скрипта завершается).
Пример класса с конструктором и деструктором:
<?php
class Resource {
public $name;
public function __construct($name) {
$this->name = $name;
echo $this->name . " was created\n";
}
public function __destruct() {
echo $this->name . " was destroyed\n";
}
}Функция unset() удаляет ссылку на объект, немедленно вызывая деструктор:
$r = new Resource("Connection");
unset($r); // explicitly destroy the objectЕсли unset() не вызвана, деструктор запускается автоматически по завершении работы скрипта.
Метод __destruct полезен для задач по очистке, таких как закрытие файлов, освобождение ресурсов или логирование.
Попробуйте сами
<?php
require_once 'resource.php';
$testCase = trim(fgets(STDIN));
if ($testCase == "basic_test") {
echo "=== Start ===\n";
$r = new Resource("FileHandler");
echo "Using " . $r->name . "\n";
unset($r);
echo "=== End ===\n";
} elseif ($testCase == "auto_destruct_test") {
$r = new Resource("Logger");
$r->logMessage("Application started");
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыВведение в ООПКлассы и объектыКлючевое слово $thisМетодыСвойстваКонструктор (__construct)Деструктор (__destruct)Итоги — Простой калькулятор4Наследование
Основы наследованияКлючевое слово parent::Переопределение методовКлючевое слово finalАбстрактные классыИтоги — Иерархия сотрудников7Инкапсуляция
Public, Protected, PrivateПодробный разбор модификаторов доступаГеттеры и сеттерыСокрытие данныхConstructor Promotion (8.0)Итоги — Система учета студентов10Продвинутые концепции ООП
Композиция против наследованияВнедрение зависимостейАнонимные классыПеречисления (PHP 8.1)Файберы (PHP 8.1)Глубокое погружение в клонирование объектовГенераторы и итераторы13Паттерны проектирования. Часть 2
Паттерн КомандаПаттерн АдаптерПаттерн ДекораторПаттерн Шаблонный методПаттерн СостояниеПаттерн КомпоновщикПаттерн Репозиторий2Пространства имен и автозагрузка
Введение в пространства именКлючевое слово useСтандарт автозагрузки PSR-4Автозагрузчик ComposerИтоги: структурированный проект5Интерфейсы и контракты
Введение в интерфейсыРеализация интерфейсовРеализация нескольких интерфейсовИнтерфейс против абстрактного классаType Hinting с интерфейсамиИтоги — Калькулятор фигур8Магические методы
Введение в магические методы__toString и __debugInfo__get, __set, __isset, __unset__call и __callStatic__clone и клонирование объектов__serialize и __unserializeИтоги — Кастомная коллекция11Система типов и обработка ошибок
Объявление типовNullable-типыТипы объединения и пересеченияКлассы исключенийИерархия пользовательских исключенийTry, Catch, FinallyИтоги — Валидатор форм14Проект: Управление библиотекой
Обзор проектаКлассы Book и User3Свойства классов
Свойства экземпляра и статические свойстваКонстанты в классахСтатические методы и свойстваПриватные и защищенные свойстваСвойства Readonly (PHP 8.1)Итоги — Менеджер банковского счета6Полиморфизм
Снова о переопределении методовПолиморфизм через интерфейсыType Hinting и Union TypesПозднее статическое связываниеИтоги — Payment Processor9Трейты
Введение в трейтыИспользование нескольких трейтовРазрешение конфликтов трейтовАбстрактные методы в трейтахТрейты и наследование12Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн SingletonПаттерн FactoryПаттерн ObserverПаттерн Strategy