PHP中是否有析构函数没有被调用的情况?

rn0zuynd  于 2023-03-28  发布在  PHP
关注(0)|答案(3)|浏览(102)

这是我第一次在stackoverflow上发帖,但是这些帖子对我帮助很大!
我问的原因是因为我有一个Map器类,它将数据Map到对象,在构造函数中,我启动一个事务,在析构函数中调用一个提交(如果需要的话,我也会有一个成员函数,它也可以执行提交)。如果有任何示例没有调用析构函数,我想知道,这样我就可以预见它的发生和适当的计划。
非常感谢!

z6psavjg

z6psavjg1#

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

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

  • 根据this SO question,当达到PHP的执行时间限制时,析构函数不会执行(在Apache 2上确认,在Windows 7上的PHP 5.2)。
  • 析构函数也不会在脚本终止时执行,因为达到了内存限制。(刚刚测试过)
  • 析构函数确实在致命错误时被执行(刚刚测试)更新:OP无法确认这一点-在不同的情况下似乎存在致命错误
  • 它不会在出现解析错误时执行(因为整个脚本不会被解释)
  • 如果服务器进程崩溃或者PHP无法控制的其他异常发生,析构函数肯定不会被执行。

总而言之,它看起来相当可靠。
但是,在析构函数中进行清理之外的其他操作的缺点是,在析构函数中的选项有些有限,不能再抛出异常(除非你在析构函数中再次捕获它们),你不能输出任何错误消息,你不能依赖其他物体的存在我在使用析构函数方面没有很深的经验,但我不确定你打算做的是不是一个可行的想法。

nr7wwzry

nr7wwzry2#

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

uurity8g

uurity8g3#

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

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

但是如果你示例化了这个类,构造函数和析构函数都会像预期的那样被调用。

$var = new TestClass;
$var->test();

但是,正如公认的答案所指出的,它们不会在达到时间限制、致命或解析错误和/或其他解释/崩溃时被调用。

相关问题