Menu
Coddy logo textTech

Деструктор (__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 полезен для задач очистки, таких как закрытие файлов, освобождение ресурсов или ведение логов, когда объект больше не нужен.

challenge icon

Задание

Средне

Завершите класс Resource в resource.php:

  1. Добавьте метод __construct, который принимает $name, устанавливает его как свойство и выводит "[name] was created"
  2. Добавьте метод logMessage, который принимает $message и выводит "Log: [message]"
  3. Добавьте метод __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");
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Объектно-ориентированное программирование