【发布时间】:2013-05-13 01:25:33
【问题描述】:
我想知道是否有人知道 PHP 的匿名函数是否有资格进行垃圾收集?
我知道使用create_function 创建的函数不会被垃圾回收,但我无法找到有关使用function(){} 语法(内部表示为闭包对象)创建的函数的任何参考。
【问题讨论】:
标签: php garbage-collection closures
我想知道是否有人知道 PHP 的匿名函数是否有资格进行垃圾收集?
我知道使用create_function 创建的函数不会被垃圾回收,但我无法找到有关使用function(){} 语法(内部表示为闭包对象)创建的函数的任何参考。
【问题讨论】:
标签: php garbage-collection closures
可以通过 xdebug_debug_zval( 'a' );如果安装了 xdebug。 http://www.php.net/manual/en/features.gc.refcounting-basics.php
【讨论】:
PHP 的垃圾收集器不区分“事物”的类型——如果它在某处至少有一个引用,它就会被保留。当这不适用时,资源将被垃圾收集。
这不与使用 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。
【讨论】:
create_function = eval。
create_function,但我没有看到任何解决方法。非常感谢您提供codereview.stackexchange.com/questions/26268/… 的任何指导