PHP需要__destruct方法吗?

时间:2011-08-30 07:57:33

标签: php garbage-collection destructor

手册说

  

一旦所有引用都会调用析构函数方法   删除特定对象或明确显示对象时   在关机顺序中被破坏或以任何顺序。

PHP GC不够用吗?有人可以举例说明__destruct方法是必要的吗?

3 个答案:

答案 0 :(得分:24)

析构函数与释放内存没有直接关系 - 相反,它是一个“钩子”,允许在对象符合回收条件时运行自定义代码。也就是说,与构造函数相反 - 构造函数不分配内存(因为在调用构造函数之前由GC完成)因此析构函数不会释放内存(如这将由GC完成。)

虽然GC可以很好地管理本机资源(例如其他对象和对象图),但是文件句柄等外部资源仍然必须“手动处理”。例如,假设一个MyFile类,析构函数将确保文件(如果打开)将被关闭 - 虽然可以说“更好”使它成为对对象调用Close / Dispose操作的要求,析构函数可以是在这种情况下用作后退机制。

我会反对在使用GC的语言中使用析构函数。他们可以引入一些微妙的问题,例如明显的非确定性和意外保持对象存活的能力 - 即使在使用引用计数的PHP等语言中也是如此。 (Java / JVM和.NET模型使用的终结器更加挑剔。)

快乐的编码。

答案 1 :(得分:2)

如果您使用例外,即使使用PHP,也应该尝试关注RAII。你必须使用析构函数来实现RAII。它是为C ++发明的,但同样的逻辑也适用于PHP。请注意,在某些情况下(例如致命错误或调用exit())PHP可能最终以不正确的顺序调用析构函数,我认为这是PHP引擎中的错误。对于正常的代码和异常,PHP引擎似乎就像是C ++程序一样。

另请参阅:Can I trust PHP __destruct() method to be called?

答案 2 :(得分:0)

__destruct魔术方法对于PHP来说是必要的,因为如果您希望 power 明确,自动且始终如一地降低引用计数恰好与其他对象共享的注入对象(比如数据库包装器对象等),然后__destruct魔术方法是可靠且可预测的这样做的地方。当然,它更像是一种约定,而不是绝对的要求,但为什么要重新发明轮子(C ++,Java等......)? PHP不仅仅适用于网页,因此我们应该牢记这一点。