在析构函数中将私有变量置空的意义是什么?

4

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

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

当PHP有垃圾回收功能时,这样做还有意义吗?它是否可以提高脚本的性能?

3个回答

3
有时候只是为了保持代码的整洁性。但在你的例子中,$observer->$db_build都引用了子对象。因此,在当前对象销毁完成之前,意图是将它们销毁。(尽管我不确定Zend core是否真的喜欢在它正在销毁的时候被中断。它可能有一个缓冲列表或其他东西。)

总之,从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->sub = NULL,对象的销毁将会分别进行,而不一定按照实例化顺序。然而,通过手动取消组合对象,PHP 会以嵌套方式销毁这三个对象:

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

2

0

首先,这是一个良好的编程习惯;其次,它可以释放脚本内存。但如果在调用析构函数后立即终止 PHP 脚本,则我认为没有任何优势。


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