我想知道PHP的匿名函数是否可以进行垃圾回收?
我知道使用create_function
创建的函数不能进行垃圾回收,但是我没有找到任何关于使用function(){}
语法(在内部表示为Closure对象)创建的函数的参考资料。
我想知道PHP的匿名函数是否可以进行垃圾回收?
我知道使用create_function
创建的函数不能进行垃圾回收,但是我没有找到任何关于使用function(){}
语法(在内部表示为Closure对象)创建的函数的参考资料。
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();
}
你将只会获得一个回音。将$k
分配更改为create_function,您将获得100个回音。
如果安装了xdebug,您可以通过xdebug_debug_zval('a')查看。http://www.php.net/manual/en/features.gc.refcounting-basics.php
create_function
=eval
。 - Sébastien Renauldcreate_function
,但我没有看到任何绕过它的方法。如果您能提供任何指导,将不胜感激。http://codereview.stackexchange.com/questions/26268/potential-problems-with-this-templating-technique - Orangepill