我想知道是否有人知道PHP的匿名函数是否符合垃圾回收的条件?
我知道用create_function
创建的函数不是垃圾收集的,但是我无法找到任何关于使用function(){}
语法创建的函数的引用(内部表示为Closure对象)。
答案 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