Php destruct когда вызывается

Деструктор 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"; >

Этот деструктор выводит сообщение о том, что объект удален. Мы можем закрыть соединение сокета с базой данных, однако я не пишу этот код. На самом деле весь процесс будет сложнее.

Читайте также:  Html свернуть развернуть блок

Надеюсь, вы разобрались в общем принципе работы деструктора:

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» ;
>
>

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(), использующиеся для других целей.

Читайте также:  Javascript удалить дубликаты массива

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

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

class MyDestructableClass function __construct () print «Конструктор\n» ;
$this -> name = «MyDestructableClass» ;
>

function __destruct () print «Уничтожается » . $this -> name . «\n» ;
>
>

$obj = new MyDestructableClass ();
?>

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

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

Замечание:

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

Замечание:

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

Источник

Оцените статью