Конструктори и деструктори

Конструктор

void __construct ( [mixed args [... ]] )

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

Забележка: Конструкторите на родителските класове не се извикват автоматично, ако в даден дъщерен клас е дефиниран конструктор. За да се изпълни контрукторът на родителския клас, е необходимо да се извика parent::__construct() в тялото на конструктора на дъщерния клас.

Пример 19-7. Използване на нови, унифицирани конструктори

<?php
class BaseClass {
   function __construct() {
       print "In BaseClass constructor\n";
   }
}

class SubClass extends BaseClass {
   function __construct() {
       parent::__construct();
       print "In SubClass constructor\n";
   }
}

$obj = new BaseClass();
$obj = new SubClass();
?>

Поради обратната съвместимост, ако PHP 5 не може да намери в даден клас метод __construct(), той ще потърси конструктор дефиниран по начина, по който се дефинира конструктор в по-старите версии, т.е. чрез функция с името на самия клас. На практика, това означава, че може да възникнат проблеми при съвместимостта, единствено, ако класа е имал метод __construct(), който е имал друг смисъл.

Деструктор

void __destruct ( void )

В PHP 5 е въведен деструкторен метод, по подобие на другите обектно-ориентирани езици, като C++. Деструкторът ще се извика в момента, в който обектът бъде унищожен.

Пример 19-8. Пример за деструктор

<?php
class MyDestructableClass {
   function __construct() {
       print "In constructor\n";
       $this->name = "MyDestructableClass";
   }

   function __destruct() {
       print "Destroying " . $this->name . "\n";
   }
}

$obj = new MyDestructableClass();
?>

Също както при конструкторите и тук деструкторът на родителския клас няма да бъде извикан автоматично. За да се изпълни деструкторът на родителския клас е необходимо изрично да се извика parent::__destruct() в тялото на деструктора.

Забележка: Деструкторите се извикват по време на спирането на скрипта, при което HTTP хедърите са изпратени. Работната директория по време на процеса на спирането на скрипта може да бъдат различна при някои SAPI-та (като например Apache).

Забележка: Опитът да се хвърли изключение в тялото на деструктор (извикан по време на приключване на работа на скрипта) ще предизвика фатална грешка.