我在我正在使用的代码中发现了以下模式:在析构函数的某些类中,我发现私有变量为空,例如:
public function __destruct()
{
foreach($this->observers as $observer)
{
$observer = null;
}
$this->db_build = null;
}
当PHP有GC时,这样做有什么意义吗?它是否以某种方式改善了脚本的性能?
答案 0 :(得分:3)
有时候只是为了清洁模因。但在您的例子中,$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->sub = NULL
,对象的破坏将分别发生,不一定是在实例化顺序中。使用手动取消设置复合对象,但PHP以嵌套方式销毁这三个对象:
<destroying first>
<destroying second>
<destroying third>
</destroying third>
</destroying second>
</destroying first>
答案 1 :(得分:2)
可能因为PHP的垃圾收集是based on reference countring,而旧版本无法处理周期性依赖关系。然后,在某些情况下,有必要手动设置对null的引用以使GC能够完成其工作,并且可能仍然存在cycle detection algorithm无法捕获的一些特殊情况。
更可能的是,它只是cargo cult programming的一个例子(维基百科条目甚至明确地将此列为例子)。
答案 2 :(得分:0)
首先 - 它是一个很好的编程音调,第二 - 它使脚本内存自由。如果在调用析构函数php脚本后立即终止,我认为没有优势。