为什么PHP在离开循环后不能清除内存?

时间:2011-02-03 09:01:03

标签: php

for($i=0; $i<3; $i++) {
    echo '$i = ' . $i . '<br/>' ;
}
echo 'out of loop, $i = ' . $i;

以上输出:

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

即使在将其显示在循环范围之外,对于我来说,即使将其显示为仍然可见也没有意义。为什么会发生这种情况(在java中它会被自动垃圾收集)?

有没有办法在退出循环范围后告诉php 自动进行垃圾收集?当我必须在每次循环后调用unset()时,我的代码看起来很难看。

3 个答案:

答案 0 :(得分:42)

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

在PHP中,for循环不会创建自己的范围。 $i在与循环相同的范围内创建,因此在循环结束后它仍然存在。除了在循环之前在行上声明的变量之外,它不会被垃圾收集。

将其视为一项功能,因为它经常被用作一个功能。例如,您不必在循环之前声明循环计数器,以便在断开循环后知道它的值是什么。

如果您手动unset变量,则可以在PHP 5.3之后使用gc_collect_cycles强制进行垃圾回收。

答案 1 :(得分:8)

来自Variable scope

  

变量的范围是定义它的上下文。在大多数情况下,所有PHP变量只有一个范围。此单一范围也涵盖包含和所需文件。 [...]在用户定义的函数中,引入了本地函数范围。函数内使用的任何变量默认都限制在本地函数范围内。

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

答案 2 :(得分:4)

如果使用递归函数替换循环,则应清除左侧变量。

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