PHP не любит деструкторы. Статические поля класса

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

В сегодняшней статье мы поговорим об конструкторах и деструкторах в ООП .

Конструкторы

Очень часто при создании экземпляра объекта на основе класса требуется выполнить какие-то базовые настройки, будь то установка свойств объекта или же открытие файлов конфигурации, да мало ли что еще. Именно для этих целей в ООП и существует метод конструктор. В версиях до PHP 5 имя метода конструктора совпадало с именем класса к которому он относится, а начиная с версии PHP 5 имя метода конструктора необходимо называть __construct() (это 2 подчеркивания перед словом construct()).

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

Class MyClass { public function __construct() { echo "Я только что был создан!"; } } $myObject = new MyClass(); // выведет «Я только что был создан!»

MyClass содержит простой конструктор, который выводит сообщения с помощью оператора echo. В последней сточке кода мы создаем экземпляр класса MyClass() и когда это происходит PHP автоматически вызывает конструктор и на экран выводится сообщение «Я только что был создан!»

Давайте теперь посмотрим еще на один пример, в котором при создании объекта происходит инициализации его свойств:

Class Product{ private $title; private $price; private $discount; public function __construct($title, $price, $discount) { $this->title = $title; $this->price = $price; $this->discount = $discount; } public function getProduct(){ echo "Наименование товара: "".$this->title.""
"; echo "Цена товара: ".$this->price ." $
"; echo "Скидка: ".$this->discount ."%
"; } } $product = new Product("Мастер создания форм",20,25); $product->getProduct();

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

Наименование товара: "Мастер создания форм" Цена товара: 20$ Скидка: 25%

Класс Product содержит 3 приватных (private) свойства: $title , $price и $discount , и конструктор, который принимает 3 аргумента: название товара, цена товара и скидка. Также имеется метод getProduct() , который выводит на экран информацию о товаре. В методе конструктора используется псевдопеременная $this для присвоения значений соответствующим свойствам объекта.

Далее мы создаем новый объект Product и передаем в нем информацию о товаре. Конструктор принимает эти данные и устанавливает соответствующие свойства объекта. И наконец вызывается метод getProduct(), который выводит на экран сохраненные значения свойств объекта.

Деструкторы

Подобно конструкторам в PHP существуют деструкторы, которые вызываются строго перед тем, как объект удаляется из памяти.

Это может понадобится, например, для удалению объектов, зависящих от удаляемого объекта, закрытие соединения с базой данных или файлов.

Примечание: PHP автоматически удаляет объект из памяти, когда не остается ни одной переменной, указывающей на него. Например, если вы создадите новый объект и сохраните его в переменной $myObject, а затем удалите ее с помощью метода unset($myObject) , то сам объект также удалится. Также, если вы создали локальную переменную в какой-либо функции, она (вместе с объектом) удалится, когда функция завершит работу.

В отличии от конструкторов, в деструкторы нельзя передавать никакие параметры!

Чтобы создать деструктор, добавьте в класс метод __destruct() . Вот простой пример:

Class MyClass { public function __destruct() { echo "Я деструктор. Объект был удален. Пока!"; } } $myObject = new MyClass(); unset($myObject); // отобразит "Я деструктор. Объект был удален. Пока!"

Мы создали простенький деструктор, который отображает на странице сообщение. Затем мы создали объект нашего класса и сразу же удалили его, вызвав метод unset() для переменной, которая ссылается на объект. Перед самым удалением объекта вызвался деструктор, который отобразил в браузере сообщение "Я деструктор. Объект был удален. Пока!" .

Также следует заметить, что деструктор вызывается и при выходе из скрипта, так как все объекты и переменные при выходе из метода удаляются. Давайте посмотрим на пример:

Class MyClass { public function __destruct() { echo "Я деструктор. Объект был удален. Пока!"; } } $myObject = new MyClass(); exit; // отобразит "Я деструктор. Объект был удален. Пока!"

Если работа скрипта прекратится из-за возникшей ошибки, деструктор тоже вызовется.

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

О на следовании мы поговорим в следующих статьях. А на сегодня все!

Деструктор класса PHP ООП — это специальная функция (принадлежащая к группе методов, известных как магические методы ), которая автоматически вызывается при удалении объекта. Деструктор не принимает никаких параметров. Понятие деструктора было введено в PHP5 , который реализует полноценную объектно-ориентированную модель. Дочерний класс может наследовать деструктор от родительского класса, если он не реализует деструктор сам.

При создании объекта может быть вызвана функция PHP-конструктора для инициализации переменных-членов. Деструктор выполняет обратную функцию, во время удаления объекта он освобождает память и ресурсы сервера. Деструктор также является важной функцией, так как ресурсы сервера ограничены, а десятки приложений различных отдельных сайтов работают на нем одновременно.

Следовательно, всегда полезно использовать PHP-деструктор . Например, в целях безопасности соединения с базой данных может потребоваться мгновенно закрыть ее сокет. В этом случае деструктор может оказаться весьма полезным.

Следует помнить, что в отличие от некоторых других языков программирования в ООП PHP существует уборщик мусора, который удаляет объекты, когда они больше не используются. Но если мы хотим удалить объект явно, PHP-деструктор подходит для этого.

Уборщик мусора PHP удаляет неиспользуемые объекты, но это может занять некоторое время, а до того момента за неиспользуемым объектом будут закреплены ресурсы. Используя деструктор, мы гарантируем, что ни один ресурс не задействуется впустую, он повышает эффективность приложений и сайтов. Если мы говорим об одном объекте, то использование деструктора не даст заметных изменений.

Но если приложение сложное, и в нем используется множество объектов, в этом случае использование PHP-деструктора может дать существенный эффект.

Синтаксис деструктора PHP

Согласно основам ООП PHP , при объявлении деструктора используется обозначение магических методов — два подчеркивания в начале и ключевое слово destruct :

Деструктор в PHP нельзя вызвать явно, так же, как мы не можем вызвать явно конструктор:

$myobject -> __destruct(); - невозможно

Еще один важный момент, касающийся деструктора: так же, как и конструктор, он вызывается для объекта только один раз — в момент удаления объекта.

Пример деструктора PHP

Ниже приводится простой пример деструктора PHP :

public function __destruct() { print "{$this->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 "{$this->Name} is destroyed...n"; parent:: _destruct(); }

Перевод статьи «PHP destructor » был подготовлен дружной командой проекта .

Хорошо Плохо

Значительно шире возможностей PHP в силу его специфики, но даже в существующей реализации она дает программисту неограниченные возможности. Конструкция PHP construct - особенный метод класса (объекта), который вызывается каждый раз, когда создается экземпляр класса.

Ограничение в том, что PHP работает в момент формирования страницы. В момент, когда страница обновляется или загружается другая страница того же сайта, нужная система объектов формируется вновь с нуля.

Создание экземпляра класса

Не обязано иметь конструктор. Если нужно подготовить начальные значения переменных, отловить момент создания экземпляра класса (объекта), провести определенные действия над другими объектами, то можно не использовать синтаксис PHP class construct и писать соответствующий код вне методов класса.

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

Когда родословная начинается значимым классом, который имеет собственные данные и свойства, связанные с внешними данными (объектами), без function construct PHP не обойтись.

В данном примере при создании (PHP construct) экземпляра класса даты будет вызвана данная функция (конструктор). Она имеет специфическое имя __construct и вызывается автоматом только один раз, когда создается экземпляр класса.

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

Наследование логики инициализации

Каждый объект должен реализовывать свое предназначение, иметь то, что ему надлежит, и делать то, что должен. С такой разумной точки зрения инициализация на каждом уровне родословной может включать в себя инициализацию в каждом предке, вызываемой с уровня потомка.

В этом примере ключевое слово parent:: позволяет вызвать конструктор предка с уровня потомка. Семантика проста. Сначала должен выполнить свою инициализацию предок, затем текущий экземпляр. Первый следует своей логике, второй - своей.

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

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

Разработчик должен строить каждую систему объектов от области применения, а не от того, как это было когда-то кем-то предложено. Каждая задача уникальна, требование использовать именно на PHP parent construct - не абсолютно.

Общие и частные конструкторы

По умолчанию конструктор является общим и доступен для использования всеми потомками. Не обязательно указывать public function construct, PHP по умолчанию рассматривает все описанное, как общее.

Насколько имеет смысл использовать ключевое слово private при описании конструкторов - специфика задачи, особенность процесса разработки или предпочтений программиста?

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

Время жизни объекта

Концепция объектно-ориентированного программирования шире возможностей PHP construct class по той простой причине, что последние существуют только в момент формирования страницы, ее повторного создания или создания другой страницы сайта.

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

PHP предоставляет возможность исполнять скрипт на сервере, когда клиент "отключился", и "допускать" клиента обратно в скрипт, запущенный им ранее, но это вовсе не тот вариант, когда объектно-ориентированная программа реализована на языке С++.

В последнем случае можно построить полноценную систему объектов, которая будет существовать "вечно", пока программа запущена и работает. Впрочем, это единственное чем может похвастаться стационарный язык программирования вроде С++, С#, Pascal&Delphi. В динамичном интернет-мире все строится иначе, живет быстрее и достигает большего.

От сериализации к самосохранению

Можно найти историческое обоснование термину "сериализация" и появлению в обиходе понятия "магические методы". Но все гораздо проще. Ровно тем же, чем отличается свобода С++ от жесткости С#, сериализация отличается от банальных понятий:

  • записать объект в строку;
  • прочитать объект из строки.

Окружить сказанное магией и мифическими магическими методами - красиво, звучно, но мало практично. Мир информации интересен прежде всего тем, что все видимое, слышимое и осязаемое можно описать простым и последовательным текстом.

Информация всегда была, есть и будет строкой символов. Не важно, какой природы. В формальных конструкциях языков программирования природа символов одна - таблица кодировки.

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

От самосохранения к саморазвитию

Семантика конструктора PHP construct в пределах его синтаксиса ограничена, но если конструктор разрабатывать с развиваемой позиции:

  • есть начало - создается абсолютно новый экземпляр;
  • есть текущее состояние - создается уже существующий экземпляр.

Ограничения PHP ввиду того, что система объектов на нем существует только в момент формирования страницы, снимутся сами собой.

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

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

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

Столько воды утекло с тех пор как ПХП провозгласил себя ООП языком. Мне не удалось уточнить когда именно, но «On July 13, 2004, PHP 5 was released, powered by the new Zend Engine II. PHP 5 included new features such as improved support for object-oriented programming».
Т.е теоретически уже тогда появились конструкторы и деструкторы. Сам пользуюсь версией 5.3.2, но диву даюсь что он вытворяет.

Немного о себе. Я программист С++, опыт 4 года. Специализация - компьютерная графика и работа с сетью. А именно создание сетевых игр. Но таким играм нужен сервер, а серверу база игроков. А игроки хотят еще и сайт. «Зачем нанимать веб-программиста, я ведь и сам неплох. Заодно и язык изучу.»
Так я думал пол года назад, но до сих пор не могу понять!

Классическое
Думаю многие кто работал с деструкторами однажды столкнулся:
PHP Fatal error: Exception thrown without a stack frame in Unknown on line 0
Первая реакция - недоумение. Вторая матная. И ведь впихивание exit() везде не дает результата, ведь догадка о том что эксепшен в деструкторе приходит далеко не сразу, а если он происходит, то скорее всего кодовая база значительная.
Ответ c bugs.php.net/bug.php?id=33598
[email protected]:
Throwing exceptions in __desctruct() is not allowed.
Should be documented..
[email protected]:
Thank you for the report, and for helping us make our documentation better.
"Attempting to throw an exception from a desctructor causes a fatal error."
Весело? Лично мне не очень.
Воспроизводится ошибка с неявным исключением очень просто.
class a
{
// ...
public function __destruct()
{
global $_SESSION;
$_SESSION = "Some information";
}
}
$dummy = new a();

^Примечание, явные исключения иногда работают верно. Буду ставить эксперементы что влияет.

Реверсный порядок очистки
Пусть в некоторой области видимости(глобальной и неочень) у нас следующий код:
$earth = new world();
$vasya = new human($earth);
Соответственно в коде конструктора человека идет его пришпандоривание к миру. (Предполагается что без мира вася существовать не будет, отбросим философию, нам проект скорее закрыть.)
Ну а в коде деструктора вася лежит аля $this->my_world->RemoveHumanFromWorld($this), в котором вызываются RemoveAllMyStuff, CalculateKarma и прочее. (Предположим у нас в мире не хранится ссылка на васю, так как это не требовалось в рамках задачи)
Что делает пхп при выходе из области видимости? Уничтожает мир и падает с ошибкой «Fatal error: Call to a member function RemoveHumanFromWorld() on a non-object in /home/god/my_projects/earth/creatures/reasonable/homo_sapiens.php on line 1956».
(Поэтому кстати мир был написан на С++, ведь богу не нужно что бы он запускался на любой вселенной. Виртуальный космос с сборщиком мусора. Ха Ха.)
Ответ с bugs.php.net/bug.php?id=36759
[email protected]
Fixed in CVS HEAD and PHP_5_2.
Найти бы этого дмитрия и ткнуть носом как в той картинке. Не знаю как там в последних версиях, пока не обновляюсь, но в 5.3 актуально.
Завершение скрипта - исключительная ситуация
Ох, про это столько можно писать. Глобальные переменные (аля сессий) перестают быть валидными, доступ к файловой системе обрубается. И вообще как я понимаю корректная работа скрипта не гарантируется. Так что не дай бог вам выполнять что то в деструкторе глобального обьекта…
Но это опустим. В документации пхп 5.1 и ранее (строфу и стих не найду) сказано: «The destructor method will be called as soon as there are no other references to a particular object», что в принципе логично для языка без строгого требования конструкции delete (лат. unset).
После баг репорта bugs.php.net/bug.php?id=38572
Документация изменилась «The destructor method will be called as soon as there are no other references to a particular object, or in any order during the shutdown sequence»
Удобно? По мне - не очень.
Только прямые ссылки
Пусть согласно логике языка обьект $a должен удалиться раньше $b.
Но пусть в обьекте $b хранится ссылка на поле $a->some_data.
Тогда по логике обьект $b должен удалиться раньше. Увы, в пхп не так. Подобной баги я не нашел, но ситуация специфическая(и не побоюсь слова исключительная). Избегается несильным патчем до ссылки на $a, терпимо и репортить я не стал.
Дедлок в стиле пхп
$a->ref = $b;
$b->ref = $a;
Мне в свое время было интересно, как пхп справится с перекресными ссылками. Зависнет ли? Упадет ли с ошибкой «нельзя покинуть область видимости», и как она будет звучать на английском. Увы, теплица показала - все переменные будут существовать до конца, пока не придет как говорится «or in any order during the shutdown sequence»
Заключение
На данный момент все что я вспомнил. А может и все что я встречал. Но создалось впечатление что деструкторы в ПХП это костыль, так что скорее всего скоро опять наткнусь.
Мне кажется будущее ООП веб-программирование за интерпретатором c++, и возможно он будет готов. Возможно кто то однажды возьмется изменить с++, добавить стандартных конструкций что бы он стал ориентированным под веб. Но пока я альтернатив не нашел.

Новая объектно-ориентированная модель в PHP5

Когда Зив Сераски (Zeev Suraski) добавил объектно-ориентированный (ОО) синтаксис в PHP 3, это можно было рассматривать как "синтаксический подсластитель для поддержки классов" ("syntactic sugar for accessing collections"). Объектно-ориентированная модель получила поддержку наследования и позволяла классу (и объекту) объединять методы и свойства, но не более того. Когда Зив и Анди переписали движок для PHP 4, это был полностью новый движок, работающий намного быстрее, намного стабильнее и с еще многими другими возможностями. Однако, изменения практически не затронули ОО модель, первоначально введенную еще в РНР 3.

Хотя объектная модель имела серьезные ограничения, она широко использовалась, часто в очень больших приложениях, написанных на PHP. Это победное шествование парадигмы ООП, даже такой ограниченной в РНР 4, привело к тому, что изменения объектной модели стали центральными в новом релизе РНР - PHP5.

Какие были ограничения в PHP 3 и 4? Самым большим ограничением (которое и приводило ко всем остальным ограничениям) был тот факт, что семантика экземпляра объекта была такой же, что и для родных типов. Как это фактически отражалось на разработчиках? Когда вы присваивали переменную (которая указывает на объект) другой переменной, то создавалась копия объекта. Мало того, что это влияло на производительность, но и это обычно приводило к ошибкам в приложении, потому что многие разработчики думали, что обе переменные будут указывать на тот же самый объект. А они указывали на разные копии того же самого объекта, поэтому, изменяя один объект, мы не меняли другой. Вот пример:

class Person {
var $name ;
function getName () {
return $this -> name ;
}
function setName ($name ) {
$this -> name = $name ;
}
function Person ($name ) {
$this -> setName ($name );
}
}

Function changeName ($person , $name ) {
$person -> setName ($name );
}

$person = new Person ("Andi" );
changeName ($person , "Stig" );
print $person -> getName ();
?>

В РНР 4 этот код выведет "Andi". Причина кроется в том, что мы передаем объект $person в функцию changeName() по значению, а не по ссылке, таким образом, объект $person будет скопирован, и changeName() будет работать уже с копией объекта $person .

Такое поведение не является интуитивно понятным. Действительно, многие разработчики ожидали Java-подобного поведения. В Java, переменные фактически являются указателями на объект, и поэтому при дублировании будет скопирован указатель, а не сам объект.

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

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

В PHP 5 объектная модель была полностью переписана для того, чтобы сразу работать с указателями на объект. Если вы явно не клонируете объект, используя ключевое слово clone , вы никогда не будете работать с копией объекта, думая, что работаете с самим объектом. В PHP 5 уже не нужно явно передавать объекты или присваивать их по ссылке, это делается.

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

Новый объектно-ориентированный подход в PHP5

Новые возможности объектной модели являются слишком многочисленными. Приведем обзор главных изменений:

  1. public/private/protected - модификаторы доступа для методов и свойств

    Позволяют управлять доступом к методам и свойствам. Теперь видимость свойств и методов может быть определена ключевыми словами: public , private , protected . Модификатор public позволяет обращаться к свойствам и методам отовсюду. Модификатор private позволяет обращаться к свойствам и методам только внутри текущего класса. Модификатор protected позволяет обращаться к свойствам и методам только текущего класса и класса, который наследует свойства и методы текущего класса.

    /**
    * Define MyClass
    */
    class MyClass
    {
    public $public = "Public" ;
    protected $protected = "Protected" ;
    private $private = "Private" ;

    Function printHello ()
    {
    echo $this -> public ;
    echo $this -> protected ;
    echo $this -> private ;
    }
    }

    $obj = new MyClass ();
    echo $obj -> public ; // Works
    echo $obj -> protected ; // Fatal Error
    echo $obj -> private ; // Fatal Error
    $obj -> printHello (); // Shows Public, Protected and Private

    /**
    * Define MyClass2
    */
    class MyClass2 extends MyClass
    {
    // We can redeclare the public and protected method, but not private
    protected $protected = "Protected2" ;

    Function printHello ()
    {
    echo $this -> public ;
    echo $this -> protected ;
    echo $this -> private ;
    }
    }

    $obj2 = new MyClass2 ();
    echo $obj -> public ; // Works
    echo $obj2 -> private ; // Undefined
    echo $obj2 -> protected ; // Fatal Error
    $obj2 -> printHello (); // Shows Public, Protected2, not Private

    ?>

  2. Унифицированный конструктор __construct()

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

    class BaseClass {
    function __construct () {
    print "Конструктор класса BaseClass\n" ;
    }
    }

    Class SubClass extends BaseClass {
    function __construct () {
    parent :: __construct ();
    print "Конструктор класса SubClass\n" ;
    }
    }

    $obj = new BaseClass ();
    $obj = new SubClass ();
    ?>

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

  3. Поддержка деструктора для класса, определяемого как метод __destructor()

    PHP 5 предоставляет концепцию деструкторов, сходную с теми, что применяются в других ОО языках, таких, как Java: когда освобождается последняя ссылка на объект, перед высвобождением памяти, занимаемой этим объектом, вызывается метод __destruct() , не принимающий параметров.

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

    Function __destruct () {
    print "Уничтожается " . $this -> name . "\n" ;
    }
    }

    $obj = new MyDestructableClass ();
    ?>

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

<<< Назад Содержание Вперед >>>
Есть еще вопросы или что-то непонятно - добро пожаловать на наш