Отправляет email-рассылки с помощью сервиса Sendsay

PHP 5 для начинающих

  Все выпуски  

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


PHP 5 для начинающих

В предлагаемом материале освещаются процессы, сопровождающие создание и разрушение объектов, а также два специальных метода - конструктор и деструктор, имеющие к этим процессам непосредственное отношение.

Новая объектная модель PHP 5 поддерживает два специальных магических метода[5], связанных с созданием и разрушением объектов - конструктор __construct() и деструктор __destruct() соответственно.

[Внимание]Внимание

Обратите внимание на два знака подчеркивания в начале названия каждого метода.

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

Разрушение объектов происходит по завершению выполнения скрипта, а также при исчезновении ссылок на данный объект (например, в результате использования выражения unset() либо непосредственного приравнивания указателя к null). Прежде, чем объект будет окончательно разрушен, предпринимается попытка вызвать для разрушаемого объекта деструктор соответствующего класса.

Конструктор представляет собой специальный метод, который автоматически вызывается при создании нового объекта (Пример 7.1, «Использование конструктора»). Обычно этот метод используется для инициализации (Пример 7.2, «Инициализация объекта»).

[Замечание]Замечание

Введенный в PHP 5 конструктор __construct() называют унифицированным (unified), так как он имеет единое название для всех классов (для сравнения см. «Конструктор в PHP).

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

Будучи по своей сути публичным методом, конструктор обычно объявляется без модификатора доступа. В классе может быть определено не более одного конструктора __construct(); однако, может быть не определено и ни одного, если в нем нет необходимости.


Как и обычные методы, конструктор может принимать аргументы, передаваемые ему при вызове оператора new.


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

[Замечание]Замечание

Если в одном классе будет определено два конструктора - в старом и новом стиле (что само по себе неправильно), то под PHP 4 будет исполнен старый конструктор (новый просто не будет распознан как конструктор), а под PHP 5 - новый, так как его наличие проверяется раньше, чем наличие старого конструктора.

Деструктор представляет собой специальный метод, который автоматически вызывается при разрушении существующего объекта (Пример 7.3, «Использование деструктора»).

[Замечание]Замечание

Поддержка деструктора появилась только в PHP 5. В предшествующих версиях деструктор отсутствовал.

В объектно-ориентированных языках программирования деструктор обычно используется для освобождения занимаемых объектом ресурсов. Поскольку PHP заботится о своевременном освобождении ресурсов самостоятельно, то в деструкторе особой необходимости обычно не возникает. Тем не менее, он может все же применяться, например, для очистки (flushing) буфера вывода, регистрации (logging) самого факта разрушения объекта и т. д.


При использовании деструктора следует иметь в виду следующие подводные камни.

  • Не гарантируется исполнение деструктора непосредственно сразу после освобождения последней ссылки на объект; прежде могут быть исполнены еще одна или несколько последующих строк кода.

  • Вывод из деструктора, исполняемого на сайте по завершению скрипта, не обязательно отобразится в броузере, так как к этому времени обработка HTTP запроса к странице может быть уже завершена.

  • Обращаться из деструктора к другому объекту крайне рискованно, так как может оказаться, что тот объект уже разрушен.

  • В теле деструктора недопустимы никакие HTTP заголовки, так как к моменту его исполнения все заголовки обычно уже посланы.

Created with DocBook


В избранное