Нужен ли метод __destruct для PHP? - PullRequest
8 голосов
/ 30 августа 2011

В руководстве сказано, что

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

Разве PHP GC недостаточно?Может ли кто-нибудь привести пример, что __destruct метод необходим?

Ответы [ 3 ]

25 голосов
/ 30 августа 2011

A деструктор не имеет прямого отношения к освобождению памяти - вместо этого это «ловушка», позволяющая запускать пользовательский код, когда объект пригоден для восстановления. То есть это противоположность конструктору - конструктор не выделяет память (как это делает GC до вызова конструктора), и, таким образом, деструктор не освобождает память (как будет сделано GC впоследствии).

Несмотря на то, что ГХ может отлично управлять собственными ресурсами (например, другими объектами и графами объектов), внешние ресурсы, такие как файловые дескрипторы, все равно должны быть "удалены вручную". Например, представьте себе класс MyFile, где деструктор будет гарантировать, что файл, если он открыт, будет закрыт, - хотя, пожалуй, «лучше» установить требование вызывать операцию Close / Dispose над объектом, деструктор может быть в этом случае используется как резервный механизм.

Я бы поспорил против общего использования деструкторов в языках с GC. Есть ряд тонких проблем, которые они могут представить, таких как явный недетерминизм и возможность случайного сохранения объектов - даже в таких языках, как PHP, которые используют подсчет ссылок. (В моделях Java / JVM и .NET используются финализаторы, которые еще более привередливы.)

Удачного кодирования.

2 голосов
/ 28 ноября 2011

Если вы используете исключения, вы должны попытаться следовать RAII даже с PHP. И вы должны использовать деструкторы для RAII. Он был изобретен для C ++, но та же логика работает и с PHP. Имейте в виду, что в некоторых случаях (например, фатальная ошибка или когда вызывается exit ()) PHP может в конечном итоге вызывать деструкторы в неправильном порядке, что я считаю ошибкой в ​​движке PHP. Для обычного кода и исключений движок PHP работает так, как если бы это была программа на C ++.

См. Также: Могу ли я доверять вызову метода PHP __destruct ()?

0 голосов
/ 15 января 2017

Магический метод __destruct необходим для PHP в том смысле, что если вы хотите, чтобы power до явно, автоматически и последовательно уменьшали счетчик ссылок для введенных объектов (скажем,объект-обертка базы данных и т. д.), которые совместно используются с другими объектами, тогда магический метод __destruct является надежным и предсказуемым местом для этого.Конечно, это скорее соглашение, чем абсолютное требование, но зачем изобретать велосипед (C ++, Java и т. Д.)?PHP не только для веб-страниц, поэтому мы должны помнить об этом.

...