PHP中是否需要使用__destruct方法?

10

手册中指出:

析构函数方法将在特定对象的所有引用被删除时自动调用,或当对象被显式销毁时,或按照关闭顺序中的任何顺序。

PHP的垃圾回收机制不足以完成这个吗?有人能给出一个需要使用__destruct方法的例子吗?


https://dev59.com/R3VC5IYBdhLWcg3w51hv - Marek Sebera
@Marek 我知道这个方法是什么,我想了解应该使用它的情况。 - xdazz
3个回答

26
一个析构函数与释放内存没有直接关系 - 相反,它是一个“钩子”,允许在对象有资格被回收时运行自定义代码。也就是说,它是构造函数的相反 - 构造函数不分配内存(因为在调用构造函数之前由GC完成),因此析构函数不释放内存(因为这将在GC之后完成)。
虽然GC可以很好地管理本地资源(例如其他对象和对象图),但外部资源(如文件句柄)仍必须“手动处理”。例如,想象一个MyFile类,其中析构函数将确保关闭文件(如果打开) - 虽然在这种情况下“更好”的做法是要求调用Close/Dispose操作,但析构函数可以用作后备机制。
我反对在具有GC的语言中普遍使用析构函数。它们可能会引入一些微妙的问题,例如表面上的非确定性和意外保持对象活动的能力 - 即使在像使用引用计数的PHP这样的语言中也是如此。(Java/JVM和.NET模型使用更加棘手的finalizers。)
祝编码愉快。

除此之外,PHP会在脚本结束时释放所有资源,因此在大多数情况下甚至不需要手动处理外部资源,例如文件句柄。 - Fabian Schmengler

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

另请参阅:我可以信任PHP的__destruct()方法会被调用吗?


0
< p > __destruct 魔术方法对于 PHP 来说是必要的,因为如果您想要以明确、自动和一致的方式降低注入对象(例如数据库包装器对象等)的引用计数,并且这些对象与其他对象共享,则 __destruct 魔术方法是一个可靠和可预测的地方来实现这一点。当然,这更多是一种约定而不是绝对要求,但为什么要重复发明轮子(如 C++、Java 等)呢?PHP 不仅仅是用于网页,所以我们应该记住这一点。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接