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

Конструктор

__construct ([ mixed $args [, $... ]] ) : void

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

Замечание: Конструкторы, определенные в классах-родителях не вызываются автоматически, если дочерний класс определяет собственный конструктор. Чтобы вызвать конструктор, объявленный в родительском классе, требуется вызвать parent::__construct() внутри конструктора дочернего класса. Если в дочернем классе не определен конструктор, то он может быть унаследован от родительского класса как обычный метод (если он не был определен как приватный).

Пример #1 Использование унифицированных конструкторов

<?php
class BaseClass {
   function 
__construct() {
       print 
"Конструктор класса BaseClass\n";
   }
}

class 
SubClass extends BaseClass {
   function 
__construct() {
       
parent::__construct();
       print 
"Конструктор класса SubClass\n";
   }
}

class 
OtherSubClass extends BaseClass {
    
// наследует конструктор BaseClass
}

// Конструктор класса BaseClass
$obj = new BaseClass();

// Конструктор класса BaseClass
// Конструктор класса SubClass
$obj = new SubClass();

// Конструктор класса BaseClass
$obj = new OtherSubClass();
?>

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

Внимание

Конструкторы старого типа объявлены УСТАРЕВШИМИ в PHP 7.0 и будут удалены в будущих версиях. В новом коде всегда используйте __construct().

В отличие от других методов, PHP не будет генерировать ошибку уровня E_STRICT, если __construct() переопределяется с другими параметрами, отличными от тех, которые были объявлены в родительском методе __construct().

Начиная с PHP 5.3.3, методы с именами, совпадающими с последним элемeнтом имени класса, находящимся в пространстве имен, больше не будут считаться конструкторами. Это изменение не влияет на классы, не находящиеся в пространстве имен.

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

<?php
namespace Foo;
class 
Bar {
    public function 
Bar() {
        
// рассматривается как конструктор в версиях PHP 5.3.0-5.3.2
        // и как обычный метод, начиная с версии PHP 5.3.3
    
}
}
?>

Деструкторы

__destruct ( void ) : void

PHP 5 предоставляет концепцию деструктора, аналогичную с той, которая применяется в других ОО-языках, таких как C++. Деструктор будет вызван при освобождении всех ссылок на определенный объект или при завершении скрипта (порядок выполнения деструкторов не гарантируется).

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

<?php
class MyDestructableClass
{
   function 
__construct() {
       print 
"Конструктор\n";
   }

   function 
__destruct() {
       print 
"Уничтожается " __CLASS__  "\n";
   }
}

$obj = new MyDestructableClass();

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

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

Замечание:

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

Замечание:

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