我决定在回调中使用闭包而不是
这可能仍然适用于我的应用程序,并且需要进一步测试,但我对这个(非常)简单的测试结果感到兴趣,它显示当可以删除四个条件(和连接符)时,
然而,由于
所以,主要问题是使用
我考虑了一些具体问题,例如,当禁用
以下是我运行的小测试:
create_function
,因此只支持PHP > 5.3,主要是因为增加了可调试性,而且我认为(关于假设的问题),在我的情况下,create_function
的即时编译开销可能会抵消函数内部必须进行的任何额外比较和处理。这可能仍然适用于我的应用程序,并且需要进一步测试,但我对这个(非常)简单的测试结果感到兴趣,它显示当可以删除四个条件(和连接符)时,
create_function
方法比闭包快两倍以上。显然,在我的测试用例中没有额外的处理,那就是大部分速度的获得或损失的地方,但是在您有很少的额外处理但有很多条件(可以被删除)并且回调被调用足够多次的情况下,我开始想到可能更好地使用create_function
。然而,由于
create_function
和eval
之间的明显相似之处,我对此持谨慎态度。所以,主要问题是使用
create_function
创建的匿名函数与闭包之间有什么区别?我考虑了一些具体问题,例如,当禁用
eval
功能时,create_function
是否仍然有效?而且,我确定最近在某个地方读到create_function
函数即使被声明为内部函数也会污染全局(或类)命名空间,但是闭包不会。现在我找不到这个参考了,但这些陈述中的任何一个或两个都是真的吗?以下是我运行的小测试:
<?php
function foo($a=true, $b=true, $c=true, $d=true)
{
$inner1 = create_function(
'',
'$r = \''.($a ? 'a' : '').
($b ? 'b' : '').
($c ? 'c' : '').
($d ? 'd' : '').'\';
return $r;'
);
$inner2 = function() use ($a, $b, $c, $d)
{
$r = '';
if($a) { $r .= 'a'; }
if($b) { $r .= 'b'; }
if($c) { $r .= 'c'; }
if($d) { $r .= 'd'; };
return $r;
};
$time = microtime(true);
for ($x=0; $x<99999; ++$x)
{
$i1out = $inner1();
}
echo '1:'.(microtime(true)-$time).'<br>';
$time = microtime(true);
for ($x=0; $x<99999; ++$x)
{
$i2out = $inner2();
}
echo '2:'.(microtime(true)-$time).'<br>';
echo var_dump($i1out===$i2out).'<br>';
}
foo();
create_function
在哪个命名空间中创建函数应该很容易 :) - Karoly Horvath