Есть ли случаи, когда деструктор в PHP НЕ вызывается? - PullRequest
14 голосов
/ 08 августа 2010

Это моя первая публикация в stackoverflow, но я очень помог этим потокам!

В любом случае, на мой вопрос ... есть ли случаи, когда деструктор в PHP НЕ вызывается?Я спрашиваю, потому что у меня есть класс mapper, который отображает данные на объекты, и в конструкторе я запускаю транзакцию, а в деструкторе я вызываю commit (у меня также будет функция-член, которая также может выполнять committal)., если необходимо).Если есть какие-то случаи, когда деструктор не вызывается, я хотел бы знать, чтобы я мог предвидеть его и планировать соответствующим образом.

Большое спасибо!

Ответы [ 2 ]

14 голосов
/ 08 августа 2010
  • Согласно руководству деструкторы выполняются, даже если сценарий завершается с использованием die() или exit():

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

  • Согласно этому SO-вопросу деструктор не запускается при достижении лимита времени выполнения PHP (подтверждено в Apache 2, PHP 5.2 в Windows 7).

  • Деструктор также не выполняется при завершении сценария, поскольку достигнут предел памяти. (Только что протестировано)

  • Деструктор выполняет при неустранимых ошибках (только что протестировано). Обновление: OP не может это подтвердить - кажется, что есть фатальные ошибки, когда все по-другому

  • Он не выполняется при разборе ошибок (поскольку весь скрипт не будет интерпретироваться)

  • Деструктор, безусловно, не будет выполнен, если произойдет сбой серверного процесса или произойдет какое-то другое исключение из-под контроля PHP.

В целом все выглядит довольно надежно.

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

2 голосов
/ 27 мая 2011

Я просто хотел бы добавить, что если у вас есть фатальная ошибка внутри деструктора, он может остановить выполнение других деструкторов.

...