【发布时间】:2011-11-06 14:26:21
【问题描述】:
说明书上说
一旦所有对a的引用,就会调用析构方法 特定对象被删除或当对象被明确 销毁或按关闭顺序中的任何顺序。
PHP GC 还不够吗?有人可以举个例子说明__destruct 方法是必要的吗?
【问题讨论】:
-
@Marek 我知道这个方法是什么,我试着知道应该使用它的情况。
标签: php garbage-collection destructor
说明书上说
一旦所有对a的引用,就会调用析构方法 特定对象被删除或当对象被明确 销毁或按关闭顺序中的任何顺序。
PHP GC 还不够吗?有人可以举个例子说明__destruct 方法是必要的吗?
【问题讨论】:
标签: php garbage-collection destructor
析构函数 与释放内存没有直接关系——相反,它是一个“挂钩”,允许在对象符合回收条件时运行自定义代码。也就是说,它 与构造函数相反 - 构造函数不分配内存(正如 GC 在调用构造函数之前所做的那样),因此析构函数不会释放内存(如这将由 GC 完成)。
虽然 GC 可以很好地管理 native 资源(例如其他对象和对象图),但文件句柄等外部资源仍然必须“手动处置”。例如,想象一个 MyFile 类,其中析构函数将确保文件(如果打开)将被关闭 - 虽然可以说“更好”要求对对象调用 Close/Dispose 操作,但析构函数可以是在这种情况下用作后备机制。
我反对在带有 GC 的语言中普遍使用析构函数。它们可能会引入许多微妙的问题,例如明显的不确定性和意外保持对象活动的能力——即使在像 PHP 这样使用引用计数的语言中也是如此。 (Java/JVM 和 .NET 模型使用更加挑剔的终结器。)
编码愉快。
【讨论】:
如果您使用异常,即使使用 PHP,您也应该尝试遵循 RAII。而且您必须对 RAII 使用析构函数。它是为 C++ 发明的,但同样的逻辑也适用于 PHP。请注意,在某些情况下(例如致命错误或调用 exit() 时)PHP 可能最终以错误的顺序调用析构函数,我认为这是 PHP 引擎中的错误。对于正常代码和异常,PHP 引擎似乎就像是 C++ 程序一样工作。
【讨论】:
__destruct 魔术方法对于 PHP 来说是必需的,因为如果您希望 power 能够显式、自动和一致地降低注入对象的引用计数(例如,数据库包装对象等),碰巧与其他对象共享,那么 __destruct 魔术方法是一个可靠且可预测的地方。当然,这更像是一种约定,而不是绝对的要求,但为什么要重新发明轮子(C++、Java 等)呢? PHP 不仅适用于网页,因此我们应该牢记这一点。
【讨论】: