2011-02-03 90 views
17
for($i=0; $i<3; $i++) { 
    echo '$i = ' . $i . '<br/>' ; 
} 
echo 'out of loop, $i = ' . $i; 

以上输出:为什么PHP在离开循环后不清除内存?

$i = 0 
$i = 1 
$i = 2 
out of loop, $i = 3 

它不会让我感觉,$ I是仍然可见甚至显示出来的循环范围之后。为什么会发生这种情况(在java中它会自动垃圾收集)?

有没有办法告诉php自动退出循环范围后做垃圾收集?我的代码看起来很难看,因为每次循环后我都必须拨打unset()

+9

这是一个功能。 – Arvin 2011-02-03 09:08:20

+20

PHP不是java – 2011-02-03 09:13:57

+0

@Mark是它的更好,没有gc要求,http://us2.php.net/manual/en/language.variables.scope.php – 2011-02-14 23:01:12

回答

42

这不是垃圾收集,而是关于范围。

在PHP中,for循环不会创建自己的作用域。 $i是在与循环相同的作用域中创建的,因此它在循环结束后仍然存在。它不会被垃圾收集,而只会在循环之前在行上声明的变量。

认为它是一个功能,因为它经常用作一个功能。例如,你不必在循环之前声明你的循环计数器,以便知道在循环之后它的值是多少。

如果您手动执行unset该变量,则可以使用PHP 5.3以上的gc_collect_cycles强制垃圾回收。

8

Variable scope

变量的范围即它被定义的上下文。大多数情况下,所有PHP变量只有一个范围。这个单一的范围跨越了包含和必需的文件。 [...]在用户定义函数中引入了本地函数作用域。在函数内部使用的任何变量缺省地局限于本地函数作用域。

该变量不会被垃圾收集,因为在离开循环后仍然在范围内引用$i。请注意,使用unset不会执行任何垃圾回收,但它只会标记不再为Garbage Collector引用的内存,以在下次运行GC时收集。您可以使用gc_collect_cycles强制垃圾回收。

4

如果您使用递归函数替换循环,则应该清除遗留变量。

只是将循环放在另一个函数中,它应该在不同的范围内,只是将数据传入和传出。

相关问题