我在我正在处理的代码中发现了以下模式:在某些类的析构函数中,我发现私有变量被置空,例如:
public function __destruct()
{
foreach($this->observers as $observer)
{
$observer = null;
}
$this->db_build = null;
}
当PHP有垃圾回收功能时,这样做还有意义吗?它是否可以提高脚本的性能?
我在我正在处理的代码中发现了以下模式:在某些类的析构函数中,我发现私有变量被置空,例如:
public function __destruct()
{
foreach($this->observers as $observer)
{
$observer = null;
}
$this->db_build = null;
}
当PHP有垃圾回收功能时,这样做还有意义吗?它是否可以提高脚本的性能?
$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>
更有可能的是,这只是模仿崇拜式编程的一个例子(维基百科甚至明确列出了这个例子)。
首先,这是一个良好的编程习惯;其次,它可以释放脚本内存。但如果在调用析构函数后立即终止 PHP 脚本,则我认为没有任何优势。