在 PHP5 中,__destruct() 方法是否保证对每个对象实例都会调用?程序中的异常会阻止这种情况吗?
值得一提的是,在具有自己析构函数的子类中,父类析构函数不会自动调用。
如果父类执行必要的清理操作,则必须在子类__destruct()方法中显式调用parent::__destruct()。
public function __construct() { register_shutdown_function(array($this, '__destruct')); }
。这种解决方案的成本是对象引用(以及对象本身)存在到 PHP 脚本执行结束。然而,在某些情况下,这仍然是值得的,比如在析构函数中进行大型临时文件清除。 - Mojo当然,如果在其他析构函数中调用了 exit(),则不会调用任何剩余的析构函数 (http://php.net/manual/en/language.oop5.decon.php)。如果发生致命错误(许多可能的原因,例如尝试从任何其他析构函数中抛出异常可能是其中之一),则不会调用任何剩余的析构函数。
当然,如果 PHP 引擎遇到分段错误或发生其他内部错误,则所有赌注都是无效的。
如果您想了解“关闭序列”的当前实现,请参见https://dev59.com/I2Yq5IYBdhLWcg3w7EwF#14101767。请注意,这个实现可能会在未来的 PHP 版本中发生改变。
目前存在一个循环引用的 bug,导致 destruct 方法无法被隐式调用。http://bugs.php.net/bug.php?id=33595 这个问题应该在 5.3 版本中得到解决。
如果你想确保关闭,可以使用一个关闭函数:register_shutdown_function()