【问题标题】:What is the point of nulling private variables in destructor?在析构函数中清空私有变量有什么意义?
【发布时间】:2011-05-28 17:48:06
【问题描述】:

我在我正在使用的代码中发现了以下模式:在析构函数的某些类中,我发现私有变量为空,例如:

public function __destruct()
{
    foreach($this->observers as $observer)
    {
        $observer = null;
    }
    $this->db_build = null;
}

当 PHP 有 GC 时这样做有什么意义吗?它是否以某种方式提高了脚本的性能?

【问题讨论】:

    标签: php variables destructor


    【解决方案1】:

    有时只是为了清洁模因。但是在您的示例中,$observer->$db_build 都引用了子对象。所以这里的目的是让它们在当前对象的销毁完成之前被销毁。 (尽管我不确定 Zend 核心是否真的喜欢在破坏性横冲直撞时被打断。它可能有一个假脱机列表或其他东西。)

    无论如何,从 GC 的角度来看,这不是必需的。但是,如果复合主语有一些非依赖性,这可能是明智的;例如计数器或注册表引用本身。所以,在大多数情况下我会说不需要。

    我做了一个愚蠢的例子来演示 __destruct 顺序:

    class dest {
            function __construct($name, $sub=NULL) {
                    $this->name = $name;
                    $this->sub = $sub;
            }
            function __destruct() {
                    print "<destroying $this->name>\n";
                    $this->sub = NULL;
                    print "</destroying $this->name>\n";
            }
    }
    
    $d = new dest("first", new dest("second", new dest("third")));
    exit;
    

    没有$this-&gt;sub = NULL,对象的破坏将单独发生,不一定按实例化顺序。然而,通过手动取消设置复合对象,PHP 会以 嵌套 方式销毁这三个对象:

    <destroying first>
        <destroying second>
            <destroying third>
            </destroying third>
        </destroying second>
    </destroying first>
    

    【讨论】:

      【解决方案2】:

      可能是因为 PHP 的垃圾回收是based on reference countring,而旧版本无法处理循环依赖。然后,在某些情况下,必须手动将引用设置为 null 以使 GC 能够完成其工作,并且可能仍然存在cycle detection algorithm 无法捕获的一些特殊情况。

      但更有可能的是,它只是 cargo cult programming 的一个示例(维基百科条目甚至明确将其列为示例)。

      【讨论】:

        【解决方案3】:

        首先 - 这是一种很好的编程基调,其次 - 它可以释放脚本内存。如果在调用析构函数 php 脚本后立即终止,我认为没有任何优势。

        【讨论】:

          猜你喜欢
          • 2011-04-27
          • 2021-07-08
          • 2015-01-12
          • 1970-01-01
          • 1970-01-01
          • 2010-10-12
          • 2014-02-12
          • 2015-03-12
          • 1970-01-01
          相关资源
          最近更新 更多