Конструктори та деструктори, Посібник з PHP

Конструктор

PHP 5 дозволяє оголошувати методи-конструктори. Класи, в яких оголошено метод-конструктор, викликатимуть цей метод при кожному створенні нового об'єкта, так що це може бути корисним, наприклад, для ініціалізації будь-якого стану об'єкта перед його використанням.

Зауваження : Конструктори в класах-батьках не викликаються автоматично, якщо клас-нащадок визначає власний конструктор. Щоб викликати конструктор, оголошений у батьківському класі, слід звернутися до методуparent::__construct() всередині конструктора класу-нащадка. Якщо в класі-нащадці не визначено конструктора, то він може успадковуватися від батьківського класу як звичайний метод (якщо він не визначений як приватний).

Приклад #1 Використання уніфікованих конструкторів

З метою зворотної сумісності, якщо PHP 5 не може виявити оголошений метод __construct() і цей метод не успадковується від батьківських класів, виклик конструктора відбудеться за застарілою схемою, через звернення до методу, ім'я якого відповідає імені класу. Може виникнути лише одна проблема сумісності старого коду, якщо в ньому є класи з методами __construct(), які використовуються для інших цілей.

На відміну від інших методів, PHP не генеруватиме помилку рівняE_STRICT, якщо __construct() буде перекритий методом з іншими параметрами, відмінними від тих, що знаходяться в батьківському __construct().

Починаючи з версії PHP 5.3.3, методи з іменами, що збігаються з останнім елементом імені класу, що знаходиться в просторі імен, більше не вважатимуться конструкторами. Ця зміна не впливає на класи, що не перебувають у просторі імен.

Приклад #2 Конструктори вкласах, що у просторі імен

Деструктори

PHP 5 надає концепцію деструкторів, подібну до тих, що застосовуються в інших ГО мовами, таких, як C++. Деструктор буде викликаний у разі звільнення всіх посилань на певний об'єкт або при завершенні скрипту (порядок виконання деструкторів не гарантується).

Приклад #3 Приклад використання деструктора

function __destruct() print "Знищується". $this -> name. "\n"; > >

$obj = New MyDestructableClass(); ?>

Як і у випадку з конструкторами, деструктори, оголошені у батьківському класі, не будуть викликані автоматично. Для виклику деструктора, оголошеному в класі-батьку, слід звернутися до методу :>destruct() в тілі деструктора-нащадка. Також клас-нащадок може успадкувати деструктор із батьківського класу, якщо він не визначений у ньому.

Деструктор буде викликаний навіть у разі, якщо скрипт було зупинено з допомогою функції exit() . Виклик exit() у деструкторі запобігає запуску всіх наступних функцій завершення.

Зауваження :

Деструктори, що викликаються при завершенні скрипта, викликаються після надсилання заголовків HTTP. Робоча директорія під час фази завершення скрипта може відрізнятися у деяких SAPI (наприклад, Apache).

Зауваження :

Спроба кинути виняток у деструкторі (викликаного під час завершення скрипту) спричиняє фатальну помилку.