我是PHP新手(通常是写软件)。我已经读过,当一个对象超出范围时,它将被释放,所以不需要手动完成。但是,如果我有一个类似的脚本:
while ($var == 1) {
$class = new My_Class();
//Do something
if ($something) {
break;
}
}
这个脚本将循环,直到$something
为真,在我看来会创建很多$class
的实例。我需要在每次迭代结束时释放它吗?同一个var名称会重新引用自己吗?如果我确实需要释放它,unset()
会满足吗?
感谢。
答案 0 :(得分:3)
将新实例分配给变量时,该变量引用的旧实例(如果有)的reference count减少了。在这种情况下,引用计数将变为零。由于它不再被引用,它将被自动清理。
从PHP 5.3开始,有一个适当的garbage collector,它也可以处理循环引用。您可以致电gc_enable
启用它。
答案 1 :(得分:2)
在这种情况下,unset()
它没有必要,因为它将在循环的每次迭代中被覆盖。根据{{1}}循环中正在执行的其他操作,可能最好在循环外指定while
。 $class
每次迭代都会改变吗?
$class
答案 2 :(得分:2)
除非:循环将运行很长时间;您预计会有大量并发用户;或者服务器上的资源有限(即自托管,VPS /共享等),那么您不必担心它。在任何脚本不会运行很长时间(少于5秒)的情况下,你试图释放内存的任何东西都不如PHP的垃圾收集器那么有效。
也就是说,如果您需要清除引用(因为上述场景之一,或者因为您想要整洁),可以将变量设置为null或使用unset
函数。这将删除引用,PHP的垃圾收集器将清理它,因为没有更多的引用。