Деструктор (__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.
Попробуйте сами
<?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Модификаторы доступа подробноГеттеры и сеттерыСокрытие информацииПродвижение конструктора (8.0)Повторение — система учёта студентов2Пространства имён и автозагрузка
Введение в пространства имёнКлючевое слово useСтандарт автозагрузки PSR-4Автозагрузчик ComposerПовторение — структурированный проект5Интерфейсы и контракты
Введение в интерфейсыРеализация интерфейсовРеализация нескольких интерфейсовИнтерфейс и абстрактный классАннотация типов с интерфейсамиПовторение — калькулятор фигур8Магические методы
Введение в магические методы__toString и __debugInfo__get, __set, __isset, __unset__call и __callStatic__clone и клонирование объектов__serialize и __unserializeПовторение — пользовательская коллекция3Свойства классов
Свойства экземпляра и статические свойстваКонстанты в классахСтатические методы и свойстваПриватные и защищённые свойстваСвойства только для чтения (PHP 8.1)Повторение — менеджер банковского счёта6Полиморфизм
Повторение переопределения методовПолиморфизм через интерфейсыАннотации типов и объединённые типыПозднее статическое связываниеПовторение — обработчик платежей9Трейты
Введение в трейтыИспользование нескольких трейтовРазрешение конфликтов трейтовАбстрактные методы в трейтахТрейты и наследование12Паттерны проектирования, часть 1
Введение в паттерны проектированияПаттерн SingletonПаттерн FactoryПаттерн ObserverПаттерн StrategyПотренируйтесь самостоятельно: Онлайн-компилятор PHP