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

evi*_*iko 17 php

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

以上产出:

$i = 0
$i = 1
$i = 2
out of loop, $i = 3
Run Code Online (Sandbox Code Playgroud)

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

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

Dan*_*man 42

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

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

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

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

  • 想要注意的是,在一个简单的例子中(事实上,在99.999%的情况下),不需要甚至推荐调用GC.也许如果您在脚本生命周期的早期使用巨型数据结构,但即便如此,如果您不这样做,也可能会更好. (2认同)

Gor*_*don 8

来自可变范围

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

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