PHP Closure对象是否有资格进行垃圾回收

时间:2013-05-17 19:24:53

标签: php garbage-collection closures

我想知道是否有人知道PHP的匿名函数是否符合垃圾回收的条件?

我知道用create_function创建的函数不是垃圾收集的,但是我无法找到任何关于使用function(){}语法创建的函数的引用(内部表示为Closure对象)。

2 个答案:

答案 0 :(得分:10)

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

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

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

<?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。

答案 1 :(得分:0)

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