Есть ли случаи, когда деструктор в PHP НЕ вызывается?

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

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

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

14
задан Charles 23 December 2012 в 21:33
поделиться

1 ответ

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

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

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

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

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

  • Это действительно not запускаются при ошибках синтаксического анализа (потому что весь сценарий не будет интерпретироваться)

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

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

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

14
ответ дан 1 December 2019 в 13:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: