PHP 中是否存在不调用析构函数的情况?

问题描述 投票:0回答:3

这是我第一次在 stackoverflow 上发帖,但这些帖子对我帮助很大!

无论如何,关于我的问题... PHP 中的析构函数是否有未被调用的情况?我问的原因是因为我有一个映射器类,它将数据映射到对象,在构造函数中,我启动一个事务,在析构函数中我将调用提交(我还有一个成员函数,它也可以执行提交) ,如有必要)。如果存在未调用析构函数的情况,我想知道,以便我可以预测它的发生并进行适当的计划。

非常感谢!

php oop destructor
3个回答
16
投票
  • 根据手册,即使脚本使用

    die()
    exit()
    终止,析构函数也会被执行:

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

  • 根据这个SO问题,当达到PHP的执行时间限制时,析构函数不会被执行(在Apache 2、Windows 7上的PHP 5.2上得到确认)。

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

    在致命错误时执行(刚刚测试)更新:OP无法确认这一点 - 事情不同的地方似乎存在致命错误
  • 不会

    在解析错误时执行(因为整个脚本不会被解释)
  • 如果服务器进程崩溃或者发生PHP无法控制的其他异常,析构函数肯定不会被执行。

  • 总而言之,看起来还是蛮靠谱的。

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

我想补充一点,如果析构函数内出现致命错误,它可以阻止其他析构函数执行。


2
投票
在类中静态调用方法时,不会调用析构函数(以及构造函数);例如:

class TestClass { public function __construct(){ echo "constructor function called!<br>"; } public static function test(){ echo "static function called!<br>"; } public function __destruct(){ echo "destructor function called!<br>"; } } TestClass::test(); // does not call neither the constructor nor the destructor

0
投票
但是,如果实例化该类,构造函数和析构函数都将按预期被调用。

$var = new TestClass; $var->test();
但是,正如已接受的答案所指出的,在达到时间限制、致命或解析错误和/或其他expeptions/崩溃时,不会调用它们。


© www.soinside.com 2019 - 2024. All rights reserved.