Деструктор PHP
Деструктор класса PHP ООП — это специальная функция ( принадлежащая к группе методов, известных как магические методы ), которая автоматически вызывается при удалении объекта. Деструктор не принимает никаких параметров. Понятие деструктора было введено в PHP5 , который реализует полноценную объектно-ориентированную модель. Дочерний класс может наследовать деструктор от родительского класса, если он не реализует деструктор сам.
При создании объекта может быть вызвана функция PHP-конструктора для инициализации переменных-членов. Деструктор выполняет обратную функцию, во время удаления объекта он освобождает память и ресурсы сервера. Деструктор также является важной функцией, так как ресурсы сервера ограничены, а десятки приложений различных отдельных сайтов работают на нем одновременно.
Следовательно, всегда полезно использовать PHP-деструктор . Например, в целях безопасности соединения с базой данных может потребоваться мгновенно закрыть ее сокет. В этом случае деструктор может оказаться весьма полезным.
Следует помнить, что в отличие от некоторых других языков программирования в ООП PHP существует уборщик мусора, который удаляет объекты, когда они больше не используются. Но если мы хотим удалить объект явно, PHP-деструктор подходит для этого.
Уборщик мусора PHP удаляет неиспользуемые объекты, но это может занять некоторое время, а до того момента за неиспользуемым объектом будут закреплены ресурсы. Используя деструктор, мы гарантируем, что ни один ресурс не задействуется впустую, он повышает эффективность приложений и сайтов. Если мы говорим об одном объекте, то использование деструктора не даст заметных изменений.
Но если приложение сложное, и в нем используется множество объектов, в этом случае использование PHP-деструктора может дать существенный эффект.
Синтаксис деструктора PHP
Согласно основам ООП PHP , при объявлении деструктора используется обозначение магических методов — два подчеркивания в начале и ключевое слово destruct :
Деструктор в PHP нельзя вызвать явно, так же, как мы не можем вызвать явно конструктор:
$myobject -> __destruct(); - невозможно
Еще один важный момент, касающийся деструктора: так же, как и конструктор, он вызывается для объекта только один раз — в момент удаления объекта.
Пример деструктора PHP
Ниже приводится простой пример деструктора PHP :
public function __destruct() < print "Name> is destroyed. n"; >
Этот деструктор выводит сообщение о том, что объект удален. Мы можем закрыть соединение сокета с базой данных, однако я не пишу этот код. На самом деле весь процесс будет сложнее.
Надеюсь, вы разобрались в общем принципе работы деструктора:
public function __destruct()
Другой ООП PHP пример полного кода деструктора и конструктора:
name = "Car"; > function __destruct() < print "Destroying " . $this->name . "n"; > > $obj = new Car(); ?>
В PHP ООП деструктор вызывается только один раз. Лучше всего использовать Parent::_destruct() . Но родительский деструктор следует вызывать после того места, где размещается код деструктора, чтобы быть уверенным, что объект не будет удален, прежде чем он был использован в приложении.
Смотрите приведенный ниже пример:
public function __destruct() < print "Name> is destroyed. n"; parent:: _destruct(); >
Деструктор PHP
Деструктор класса PHP объектно-ориентированного программирования — это специальная функция, принадлежащая к группе так называемых магических методов, которая автоматически вызывается при удалении объекта. Когда освобождается последняя ссылка на объект, перед высвобождением памяти, занимаемой этим объектом, вызывается метод __destruct(), не принимающий параметров.
Что такое деструктор PHP?
В прошлом уроке вы узнали, что при создании объекта может быть вызвана функция-конструктор __construct() для инициализации переменных-членов. Функция-деструктор __destruct() выполняет обратную миссию — во время удаления объекта она освобождает память и ресурсы сервера. Деструктор выполняет важную функцию, так как на сервере одновременно работают десятки приложений различных отдельных сайтов, а ресурсы любого сервера ограничены.
Объявление функции-деструктора начинается начинается с двух знаков подчеркивания (__) и ключевого слова destruct :
Деструктор вызывается для объекта только один раз — в момент удаления объекта. Этот метод полезен, когда вы хотите выполнить какие-либо действия в последнюю минуту (например, сохранить или распечатать некоторые данные после их удаления).
В приведенном ниже примере класс Test выводит сообщение при создании экземпляра объекта и печатает другое сообщение при его удалении:
Пример
name = $name; echo 'Добро пожаловать, '. $this->name. '
'; > // Деструктор function __destruct() < echo 'Прощай, '. $this->name; > > $user = new Test("Stiven"); ?>
Результат выполнения кода:
В следующем примере деструктор очищает несколько свойств:
Пример
name = $name; $this->color = $color; > function __destruct() < echo "Название фрукта name> и его цвет color>."; > > $apple = new Fruit("яблоко", "красный"); ?>
Результат выполнения кода:
В приведенных выше примерах метод __destruct() будет вызываться в конце выполнения скрипта.
Примечание: Метод __desctructor будет вызываться только тогда, когда текущий скрипт PHP будет полностью выполнен, достигнув его последней строки или выйдя из него с помощью функций exit() или die() .
Конструкторы и деструкторы
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).
Замечание:
Попытка бросить исключение в деструкторе (вызванного во время завершения скрипта) влечет за собой фатальную ошибку.