这是我第一次发布到stackoverflow,但这些线程对我帮助很大!
Anywho,在我的问题上...是否有任何实例在PHP中的析构函数未被调用?我问的原因是因为我有一个mapper类,它将数据映射到对象,在构造函数中,我启动一个事务,在析构函数中我将调用一个提交(我也有一个成员函数也可以执行提交,如有必要)。如果有任何没有调用析构函数的情况,我想知道所以我可以预期它会发生并进行适当的计划。
非常感谢!
答案 0 :(得分:14)
根据manual,即使脚本使用die()
或exit()
终止,也会执行析构函数:
即使使用exit()停止脚本执行,也会调用析构函数。在析构函数中调用exit()将阻止剩余的关闭例程执行。
根据this SO question,当达到PHP的执行时间限制时,析构函数执行不执行(在Apache 2上确认,在Windows 7上为PHP 5.2)。
当脚本终止时,析构函数也会执行 not ,因为已达到内存限制。 (刚刚测试过)
析构函数确实在致命错误上执行(刚刚测试过)更新:OP无法确认这一点 - 似乎有不同的致命错误
< / LI>执行解析错误(因为不会解释整个脚本)
如果服务器进程崩溃或出现PHP控件之外的其他异常,则肯定不会执行析构函数。
总而言之,它看起来非常可靠。
但是,在析构函数中进行清理以外的其他操作的缺点是,您的选择在某种程度上是有限的。你不能再抛出异常(除非你在析构函数中再次捕获它们),你不能输出任何错误消息,你不能真正依赖于其他对象(如数据库接口)的存在。 ....我在使用析构函数方面没有丰富的经验,但我不确定你计划做的是否是一个可行的想法。
答案 1 :(得分:2)
我想补充一点,如果你在析构函数中有致命错误,它可以阻止其他析构函数执行。