在没有调用PHP中的析构函数时是否有任何实例?

时间:2010-08-08 12:22:30

标签: php oop destructor

这是我第一次发布到stackoverflow,但这些线程对我帮助很大!

Anywho,在我的问题上...是否有任何实例在PHP中的析构函数未被调用?我问的原因是因为我有一个mapper类,它将数据映射到对象,在构造函数中,我启动一个事务,在析构函数中我将调用一个提交(我也有一个成员函数也可以执行提交,如有必要)。如果有任何没有调用析构函数的情况,我想知道所以我可以预期它会发生并进行适当的计划。

非常感谢!

2 个答案:

答案 0 :(得分:14)

  • 根据manual,即使脚本使用die()exit()终止,也会执行析构函数:

      

    即使使用exit()停止脚本执行,也会调用析构函数。在析构函数中调用exit()将阻止剩余的关闭例程执行。

  • 根据this SO question,当达到PHP的执行时间限制时,析构函数执行执行(在Apache 2上确认,在Windows 7上为PHP 5.2)。

  • 当脚本终止时,析构函数也会执行 not ,因为已达到内存限制。 (刚刚测试过)

  • 析构函数确实在致命错误上执行(刚刚测试过)更新:OP无法确认这一点 - 似乎有不同的致命错误

    < / LI>
  • 执行解析错误(因为不会解释整个脚本)

  • 如果服务器进程崩溃或出现PHP控件之外的其他异常,则肯定不会执行析构函数。

总而言之,它看起来非常可靠。

但是,在析构函数中进行清理以外的其他操作的缺点是,您的选择在某种程度上是有限的。你不能再抛出异常(除非你在析构函数中再次捕获它们),你不能输出任何错误消息,你不能真正依赖于其他对象(如数据库接口)的存在。 ....我在使用析构函数方面没有丰富的经验,但我不确定你计划做的是否是一个可行的想法。

答案 1 :(得分:2)

我想补充一点,如果你在析构函数中有致命错误,它可以阻止其他析构函数执行。