Конструкторы и деструкторы
PHP 5 позволяет объявлять методы-конструкторы. Классы, в которых объявлен метод-конструктор, будут вызывать этот метод при каждом создании нового объекта, так что это может оказаться полезным, например, для инициализации какого-либо состояния объекта перед его использованием.
Замечание: Конструкторы в классах-родителях не вызываются автоматически, если класс-потомок определяет собственный конструктор. Чтобы вызвать конструктор, объявленный в родительском классе, следует обратиться к методу parent::__construct() внутри конструктора класса-потомка. Если в классе-потомке не определен конструктор, то он может наследоваться от родительского класса как обычный метод (если он не определен как приватный).
Пример #1 Использование унифицированных конструкторов
class BaseClass function __construct () print «Конструктор класса BaseClass\n» ;
>
>
?php
class SubClass extends BaseClass function __construct () parent :: __construct ();
print «Конструктор класса SubClass\n» ;
>
>
class OtherSubClass extends BaseClass // inherits BaseClass’s constructor
>
// In BaseClass constructor
$obj = new BaseClass ();
// In BaseClass constructor
// In SubClass constructor
$obj = new SubClass ();
// In BaseClass constructor
$obj = new OtherSubClass ();
?>
В целях обратной совместимости, если PHP 5 не может обнаружить объявленный метод __construct() и этот метод не наследуется от родительских классов, то вызов конструктора произойдет по устаревшей схеме, через обращение к методу, имя которого соответствует имени класса. Может возникнуть только одна проблема совместимости старого кода, если в нём присутствуют классы с методами __construct(), использующиеся для других целей.
В отличие от других методов, PHP не будет генерировать ошибку уровня E_STRICT , если __construct() будет перекрыт методом с другими параметрами, отличными от тех, которые находятся в родительском __construct().
Начиная с версии PHP 5.3.3, методы с именами, совпадающими с последним элементом имени класса, находящимся в пространстве имен, больше не будут считаться конструкторами. Это изменение не влияет на классы, не находящиеся в пространстве имен.
Пример #2 Конструкторы в классах, находящихся в пространстве имен
namespace Foo ;
class Bar public function Bar () // конструктор в версиях PHP 5.3.0-5.3.2
// обычный метод, начиная с версии PHP 5.3.3
>
>
?>?php
Деструкторы
PHP 5 предоставляет концепцию деструкторов, сходную с теми, что применяются в других ОО языках, таких, как C++. Деструктор будет вызван при освобождении всех ссылок на определенный объект или при завершении скрипта (порядок выполнения деструкторов не гарантируется).
Пример #3 Пример использования деструктора
class MyDestructableClass function __construct () print «Конструктор\n» ;
$this -> name = «MyDestructableClass» ;
>
?php
function __destruct () print «Уничтожается » . $this -> name . «\n» ;
>
>
$obj = new MyDestructableClass ();
?>
Как и в случае с конструкторами, деструкторы, объявленные в родительском классе, не будут вызваны автоматически. Для вызова деструктора, объявленном в классе-родителе, следует обратиться к методу parent::__destruct() в теле деструктора-потомка. Также класс-потомок может унаследовать деструктор из родительского класса, если он не определен в нем.
Деструктор будет вызван даже в том случае, если скрипт был остановлен с помощью функции exit() . Вызов exit() в деструкторе предотвратит запуск всех последующих функций завершения.
Замечание:
Деструкторы, вызываемые при завершении скрипта, вызываются после отправки HTTP-заголовков. Рабочая директория во время фазы завершения скрипта может отличаться в некоторых SAPI (например, в Apache).
Замечание:
Попытка бросить исключение в деструкторе (вызванного во время завершения скрипта) влечет за собой фатальную ошибку.
Где и в каких случаях в php (ООП) используется __constructor?
Воспринимайте конструктор как то, что срабатывает при вызове:
new Object()
Способов применения масса. Я думаю, вы часто видели, если что-то писали на ООП-PHP конструкции типа
new Object($var, $anotherVar);
Выше ответили про присвоение значений свойствам класса, но это может быть и что-то более интересное, например, оповещение приложения о создании объекта, получение файлов конфигурации и настройка объекта из них и так далее, и тому подобное.
Метод конструктор вызывается при инициализации объекта. В контексте PHP его главная задача — инициализировать все свойства значениями, что бы добиться какого-то начального состояния объекта. Так же туда следует передавать все зависимые классы. И крайне не рекомендуется в конструкторе делать что-то сложное, например, как пишет @hlogeon, кого-то нотифаить о своем присутствии, или с конфигами работать. Это все должно быть по хорошему сделано до инициализации. Если у вас в конструкторе код лезет в файлы/базу то это уже сигнал о плохом дизайне.
class Bar < public function doSomething() <>> class Foo< private $bar; private $someConfig; private $createdAt; public function __construct(Bar $bar, $someConfig) < $this->bar = $bar; $this->someConfig = $someConfig; $this->createdAt = new \DateTime(); > > // загружаем конфиг каким-то образом // мы не должны заставлять Foo что-то делать еще, что не относится к его задаче // например он не должен знать как создается класс Bar и что ему нужно // он не должен ничего знать о том где хранятся конфиги и т.д. // Для этого можно отдельный класс сделать, который будет знать где брать конфиги // но не будет знать как эти конфиги используются. $config = $configurator->getConfig('foo'); $bar = new Bar(); $foo = new Foo($bar, $config);