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