我已经决定使用闭包而不是create_function
,因此只支持PHP> 5.3,这主要是由于增加了可调试性,也是因为我认为(他们对假设的看法是什么? )在我的情况下,编译create_function
的开销可能会抵销任何额外的比较,并且必须在函数中进行。 (这对我的应用程序而言)并且需要进一步的测试,但是我对这个(非常)简单的测试的输出感兴趣,它显示了create_function
方法的速度是当它只能删除四个条件(连接)时关闭。很明显,在我的测试用例中没有额外的处理,这就是大部分速度会增加或者丢失的地方,但是如果你只有很少的额外处理,但是很多条件(可以被删除)和回调被称为足够多的时间,我开始认为使用create_function
可能会更好。PHP中的闭包或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' ..创建函数.. :) –
我会去封闭也。就速度而言,也许你应该用真实世界的案例来测试它。我不知道为什么这个应该慢得多,但我会采取'打'。另外,APC在这种情况下是否有所作为?闭包是否缓存在操作码中?它也可能有所作为。 – Arend
将它们分开。这个问题已经很长了。 – phihag