Конструкторы и деструкторы в PHP 8

У каждого объекта есть два особых момента в жизни: рождение и уничтожение. В PHP за эти моменты отвечают два специальных метода — конструктор __construct() и деструктор __destruct(). Они вызываются автоматически, и понимание их работы — важный шаг к написанию грамотного объектно-ориентированного кода.

 

Что такое конструктор?

Конструктор — это магический метод __construct(), который PHP вызывает автоматически в момент создания объекта через оператор new. Он используется для инициализации объекта: установки начальных значений свойств, открытия соединений, подготовки данных.

Если конструктор не объявлен явно, PHP использует пустой конструктор по умолчанию.

class DatabaseConnection

{

    private $connection;

   //конструктор

    public function __construct(

        private readonly string $host,

        private readonly string $dbName,

        private readonly string $user,

        private string $password

    ) {

        // Устанавливаем соединение сразу при создании объекта

        $this->connection = new \PDO(

            "mysql:host={$this->host};dbname={$this->dbName}",

            $this->user,

            $this->password

        );

        echo "Соединение с базой данных установлено.\n";

    }

 

    public function getConnection(): \PDO

    {

        return $this->connection;

    }

}

// __construct() вызывается автоматически

$db = new DatabaseConnection('localhost', 'mydb', 'root', 'secret');

// Вывод: Соединение с базой данных установлено.

В PHP 8 параметры конструктора с модификаторами доступа (public, private, readonly) автоматически становятся свойствами класса. Это называется «constructor promotion» и избавляет от лишнего кода.

 

Что такое деструктор?

Деструктор — это магический метод __destruct(), который PHP вызывает автоматически, когда объект уничтожается: когда скрипт завершается, переменная выходит из области видимости или вы явно удаляете объект через unset().

Деструктор используется для освобождения ресурсов: закрытия соединений, записи логов, удаления временных файлов.

class DatabaseConnection

{

    private $connection;

    public function __construct(

        private readonly string $host,

        private readonly string $dbName,

        private readonly string $user,

        string $password

    ) {

        $this->connection = new \PDO(

            "mysql:host={$this->host};dbname={$this->dbName}",

            $this->user,

            $password

        );

        echo "[+] Соединение открыто.\n";

    }

 

    // Деструктор — вызывается при уничтожении объекта

    public function __destruct()

    {

        $this->connection = null; // закрываем PDO-соединение

        echo "[-] Соединение закрыто.\n";

    }

}

$db = new DatabaseConnection('localhost', 'mydb', 'root', 'secret');

// Вывод: [+] Соединение открыто.

unset($db); // явно уничтожаем объект

// Вывод: [-] Соединение закрыто.

echo "Скрипт продолжает работу.\n";

 

__construct()

Вызывается один раз при создании объекта. Принимает параметры. Используется для инициализации данных и ресурсов.

__destruct()

Вызывается при уничтожении объекта. Не принимает параметров. Используется для освобождения ресурсов.

 

Практический пример: логирование

Посмотрим, как конструктор и деструктор работают вместе на примере класса для записи в лог-файл:

class Logger

{

    private $fileHandle;

 

    public function __construct(private readonly string $filePath)

    {

        // Открываем файл при создании объекта

        $this->fileHandle = fopen($this->filePath, 'a');

 

        if (!$this->fileHandle) {

            throw new \RuntimeException(

                "Не удалось открыть файл: {$this->filePath}"

            );

        }

 

        $this->write('--- Сессия логирования начата ---');

    }

 

    public function write(string $message): void

    {

        $line = '[' . date('Y-m-d H:i:s') . '] ' . $message . "\n";

        fwrite($this->fileHandle, $line);

    }

 

    public function __destruct()

    {

        // Закрываем файл при уничтожении объекта

        if ($this->fileHandle) {

            $this->write('--- Сессия логирования завершена ---');

            fclose($this->fileHandle);

        }

    }

}

$log = new Logger('/var/log/app.log');

$log->write('Пользователь вошёл в систему');

$log->write('Загружена страница /dashboard');

// При завершении скрипта __destruct() закроет файл автоматически

 

Деструктор не подходит для критически важных операций (например, коммит транзакции). Порядок уничтожения объектов при завершении скрипта не гарантирован. Для таких задач используйте явные методы close() или commit().

 

Конструктор и деструктор — это две точки контроля над жизненным циклом объекта. Конструктор __construct() подготавливает объект к работе: принимает параметры, инициализирует свойства, открывает нужные ресурсы. Деструктор __destruct() завершает работу объекта корректно: освобождает память, закрывает соединения, сохраняет данные.

PHP 8 упрощает написание конструкторов благодаря constructor promotion — объявлению свойств прямо в параметрах. Это делает код компактнее и чище.

Logo

Spartacus_85 [Admin]

Администратор сайта — это специалист, который отвечает за техническую поддержку и бесперебойную работу веб-ресурса.



0 Комментарий(я)

Зарегистрируйтесь чтобы оставить комментарий