4

我想知道是否有人知道 PHP 的匿名函数是否有资格进行垃圾收集?

我知道使用创建的函数create_function不会被垃圾收集,但我无法找到有关使用function(){}语法创建的函数的任何参考(内部表示为闭包对象)。

4

2 回答 2

10

PHP 的垃圾收集器不区分“事物”的类型——如果它在某处至少有一个引用,它就会被保留。在这不适用的那一刻,资源被垃圾收集。

using 不同create_function,因为 PHP 除了引用它之外,还会在全局范围内抛出 create_function 引用。一个闭包(一个闭包对象,如果你愿意的话,因为它们就是这样!)只存在于它创建的范围内+你传递给它的所有范围内。

如果你想说服自己,运行这段代码:

<?php
$r = memory_get_usage();
for ($i = 0; $i < 100; $i++) {
    $k = function() {echo "boo"; };
    if (memory_get_usage() > $r) {
            echo "Different memory count. Off by: ".(memory_get_usage() -$r);
    }
    $r = memory_get_usage();
}

你会得到一个回声。用 create_function替换$k赋值,你会得到 100。

于 2013-05-17T19:50:48.627 回答
0

你可以通过 xdebug_debug_zval( 'a' ); 看到 如果安装了 xdebug。http://www.php.net/manual/en/features.gc.refcounting-basics.php

于 2013-05-17T19:35:30.967 回答