【问题标题】:PHP - how to destroy object and objects it contains?PHP - 如何销毁对象及其包含的对象?
【发布时间】:2015-06-14 14:45:17
【问题描述】:

我有一个用 PHP 编写的 CLI 脚本。在这个脚本中,我有一个 mainClass 实例,其中包含许多其他类型的对象实例,这些对象存储在 PHP 数组中。如何销毁 $mainObject 及其包含的所有对象?

示例代码:

class mainClass
{
    private $_array1 = array();
    private $_array2 = array();
    private $_array3 = array();

    public function __construct($data)
    {
        foreach ($data['a1'] as $val) {
            $this->_array1[] = new Object1($val);
        }
        foreach ($data['a2'] as $val) {
            $this->_array2[] = new Object2($val);
        }
        foreach ($data['a3'] as $val) {
            $this->_array3[] = new Object3($val);
        }
    }
}

$mainObject = new mainClass($data);

function someFunction(mainClass $mainObject)
{
    unset($mainObject);
}
  1. unset($mainObject) 会破坏它及其包含的所有对象吗?
  2. 我必须单独销毁每个对象吗?
  3. 我应该使用 mainClass 的析构函数来销毁 $mainObject 包含的对象(调用它们的析构函数)吗?

【问题讨论】:

    标签: php destructor


    【解决方案1】:

    你正在寻找 unset()。

    但请注意,您不能显式销毁对象。

    它将保留在那里,但是如果您取消设置对象并且您的脚本将 PHP 推送到内存限制,则不需要的对象将被垃圾收集。我会选择 unset() (而不是将其设置为 null),因为它具有更好的性能(未经测试,但记录在 PHP 官方手册中的一个 cmets 中)。

    也就是说,请记住 PHP 总是会在页面被提供后立即销毁对象。因此,只有在非常长的循环和/或大量密集页面上才需要这样做。

    请参考此链接

    Best way to destroy PHP object?

    【讨论】:

    • 我只想补充一点,只要您没有循环引用,这将起作用。在这种情况下,由于 PHP 中的一个已知错误,您必须向对象添加适当的析构函数。
    【解决方案2】:

    最佳做法是将该对象初始化为 null。

    $mainObject  = NULL;
    

    参考: What's better at freeing memory with PHP: unset() or $var = null

    【讨论】:

      【解决方案3】:

      未设置($mainObject);将销毁对象并释放内存。

      【讨论】:

      • 如果代码中的其他地方存在对$mainObject 的引用怎么办?
      猜你喜欢
      • 2019-07-19
      • 1970-01-01
      • 1970-01-01
      • 2017-09-25
      • 2015-06-19
      • 2011-05-12
      • 1970-01-01
      • 1970-01-01
      • 2012-07-05
      相关资源
      最近更新 更多