Это моя первая публикация в stackoverflow, но я эти темы очень помогли мне!
В любом случае, на мой вопрос ... Есть ли случаи, когда деструктор в PHP не вызывается? Я спрашиваю, потому что у меня есть класс mapper, который отображает данные на объекты, и в конструкторе я запускаю транзакцию, а в деструкторе я вызываю commit (у меня также будет функция-член, которая также может выполнять committal). , если необходимо). Если есть какие-либо случаи, когда деструктор не вызывается, я хотел бы знать, чтобы я мог предвидеть его и планировать соответствующим образом.
Большое спасибо!
Согласно руководству , деструкторы выполняются, даже если сценарий завершается с помощью die ()
или exit ()
:
Деструктор будет вызываться, даже если выполнение скрипта остановлено с помощью exit (). Вызов exit () в деструкторе предотвратит выполнение оставшихся подпрограмм завершения работы.
Согласно этот вопрос SO , деструктор не запускается при достижении лимита времени выполнения PHP (подтверждено в Apache 2, PHP 5.2 в Windows 7).
Деструктор также не запускается, когда сценарий завершается, потому что был достигнут предел памяти. (Только что протестировано)
Деструктор запускается при фатальных ошибках (только что протестировано) Обновление: OP не может подтвердить это - похоже, есть фатальные ошибки, когда все по-другому
Это действительно not запускаются при ошибках синтаксического анализа (потому что весь сценарий не будет интерпретироваться)
Деструктор определенно не будет выполняться, если серверный процесс выйдет из строя или произойдет какое-либо другое исключение, не контролируемое PHP.
В целом, выглядит довольно надежно.
Обратной стороной других действий, кроме очистки в деструкторе, является то, что ваши возможности там несколько ограничены. Вы больше не можете генерировать исключения (кроме случаев, когда вы снова поймаете их внутри деструктора), вы не можете выводить какие-либо сообщения об ошибках, вы больше не можете полагаться на присутствие других объектов (например, интерфейса базы данных). .... У меня нет глубокого опыта работы с деструкторами, но я не уверен, что то, что вы планируете сделать, осуществимо.