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

Конструктор

void __construct ([ mixed $args = "" [, $... ]] ) PHP 5 позволяет объявлять методы-конструкторы. Классы, в которых объявлен метод-конструктор, будут вызывать этот метод при каждом создании нового объекта, так что это может оказаться полезным, например, для инициализации какого-либо состояния объекта перед его использованием.

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

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

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

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

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

Деструкторы

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

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

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

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

Перегрузка

Перегрузка в PHP означает возможность динамически "создавать" свойства и методы. Эти динамические сущности обрабатываются с помощью "волшебных" методов, которые можно создать в классе для различных видов действий.

Методы перегрузки вызываются при взаимодействии с теми свойствами или методами, которые не были объявлены или не видны в текущей области видимости. Все методы перегрузки должны быть объявлены как public.

Замечание: Ни один аргумент не может быть передан по ссылке в эти "волшебные" методы.

Замечание: Интерпретация "перегрузки" в PHP отличается от остальных объектно-ориентированных языков. Традиционно перегрузка означает возможность иметь множество одноименных методов с разным количеством или различными типами аргументов.

Магический метод Описание
__get() будет выполнен при чтении данных из недоступных свойств.
__set() будет выполнен при записи данных в недоступные свойства.
__isset() будет выполнен при использовании isset() или empty() на недоступных свойствах.
__unset() будет выполнен при вызове unset() на недоступном свойстве.
__call() в контексте объекта при вызове недоступных методов.
__callStatic() в статическом контексте при вызове недоступных методов.
__sleep() сериализация объекта.
__wakeup() десериализация объекта.
__invoke() при попытке выполнить объект как функцию.
__toString() преобразование объекта в строку. Функция должна возвращать строчку, иначе будет ошибка.
__set_state() статический метод вызывается для тех классов, которые экспортируются функцией var_export()
__clone() по завершении клонирования вызывается у свежесозданной копии объекта.
__debugInfo() вызывается функцией var_dump(), когда необходимо вывести список свойств объекта.