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