在PHP5,是__毁()方法,保证被称为每个对象的实例?可以例外在程序防止这种情况发生?

有帮助吗?

解决方案

当释放所有引用或脚本终止时,将调用析构函数。我认为这意味着脚本正确终止。我会说,关键异常不能保证析构函数被调用。

PHP文档有点薄,但确实说析构函数中的异常会导致的问题。

其他提示

还值得一提的是,对于具有自己的析构函数的子类,父析构函数是自动调用。

如果父类执行任何必需的清理,则必须从子类 __ destruct()方法显式调用 parent :: __ destruct()

以我的经验析构将始终呼吁在PHP5.3,但是警告说,如果一些代码通话exit()或者如果一个致命的错误发生,PHP会呼析构在"任何"顺序(我认为实际秩序是为了在存储器或为了存储器是保留的对象。在实践中,这种秩序几乎总是有问题的).这被称为"关闭序"PHP文件。

PHP文件析构 说:

PHP5个析构概念类似于其它面向对象的语言,例如C++。析构的方法将被称为尽快没有其他提到一个特定的对象,或在任何为了在关闭期间序列。

因此如果你有X类拥有一个参考Y析构的X可以被称为后析构的Y已经被称为。我们希望,参考Y并不重要...正式的,这不是一个错误,因为它已记录在案。

然而,它非常难以解决这一问题,因为正式PHP提供有办法知道如果析构是所谓的正常(析构是所谓的正确顺序)或析构是所谓的"任何"了,你不能使用的数据引用的对象,因为那些可能已经销毁。一个可能的解决方法,这种缺乏检测使用debug_backtrace()和研究堆。缺乏正常的堆似乎暗示"停车程序"与PHP5.3但是,这也是不确定的。如果你有圆形的参考文献,析构的那些物体不会被称为在所有与PHP5.2或较小,并将被称为"任何"顺序期间"的关机序列"PHP5.3或更大。对于圆形的参考文献,不存在一个逻辑上"正确的"以便"任何"顺序是很好的。

有一些例外(这是PHP毕竟):

  • 如果 exit() 是叫在另一个析构,任何剩余析构将不能称为(http://php.net/manual/en/language.oop5.decon.php)
  • 如果 FATAL 错误发生在任何地方(许多可能的原因,例如试图把一个例外,从任何其他析构可能是原因之一),任何剩余析构将不能称为。

当然,如果PHP引擎命分割故障或其他一些内部的错误发生,那么所有的赌注都关闭。

如果你想要了解 电流 执行"关闭序",看到 https://stackoverflow.com/a/14101767.注意,这种实现可以改变未来PHP versions.

循环引用存在当前错误,这会阻止隐式调用destruct方法。 http://bugs.php.net/bug.php?id=33595 它应该在5.3中修复

如果您想确定,请使用关机功能: register_shutdown_function( )

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top