【问题标题】:Is the __destruct method necessary for PHP?PHP 需要 __destruct 方法吗?
【发布时间】:2011-11-06 14:26:21
【问题描述】:

说明书上说

一旦所有对a的引用,就会调用析构方法 特定对象被删除或当对象被明确 销毁或按关闭顺序中的任何顺序。

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

【问题讨论】:

标签: php garbage-collection destructor


【解决方案1】:

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

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

我反对在带有 GC 的语言中普遍使用析构函数。它们可能会引入许多微妙的问题,例如明显的不确定性和意外保持对象活动的能力——即使在像 PHP 这样使用引用计数的语言中也是如此。 (Java/JVM 和 .NET 模型使用更加挑剔的终结器。)

编码愉快。

【讨论】:

  • >> 文件句柄等外部资源仍必须“手动处理”。
【解决方案2】:

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

另见:Can I trust PHP __destruct() method to be called?

【讨论】:

    【解决方案3】:

    __destruct 魔术方法对于 PHP 来说是必需的,因为如果您希望 power 能够显式、自动和一致地降低注入对象的引用计数(例如,数据库包装对象等),碰巧与其他对象共享,那么 __destruct 魔术方法是一个可靠且可预测的地方。当然,这更像是一种约定,而不是绝对的要求,但为什么要重新发明轮子(C++、Java 等)呢? PHP 不仅适用于网页,因此我们应该牢记这一点。

    【讨论】:

      猜你喜欢
      • 2010-09-14
      • 1970-01-01
      • 2016-06-10
      • 2016-08-27
      • 1970-01-01
      • 2010-09-18
      • 2018-03-19
      • 2011-05-02
      • 2015-09-12
      相关资源
      最近更新 更多