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

Log*_*bby 14 php oop destructor

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

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

非常感谢!

Pek*_*ica 14

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

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

  • 根据这太问题,析构函数并没有得到达到PHP的执行时间限制执行时(已确认在Apache 2,PHP 5.2在Windows 7).

  • 析构函数也并没有得到当脚本终止,因为内存的限制达到执行.(刚刚测试过)

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

  • 它并没有得到关于解析错误执行(因为整个脚本不会被解释)

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

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

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

  • 如果您需要在发生 php 致命错误的情况下调用析构函数,请在构造函数中将其注册为关闭处理程序: `public function __construct() { register_shutdown_function(array($this, '__destruct')); }`。此解决方案的成本是对象引用(以及对象本身)一直存在到 php 脚本执行结束。尽管如此,在某些情况下还是值得的 - 例如,在析构函数中删除巨大的 tmp 文件。 (2认同)