在JavaScript中,您可以定义立即执行的匿名函数:
(function () { /* do something */ })()
您可以在PHP中做类似的事情吗?
在JavaScript中,您可以定义立即执行的匿名函数:
(function () { /* do something */ })()
您可以在PHP中做类似的事情吗?
Answers:
对于PHP7:请参见Yasuo Ohgaki的答案:(function() {echo 'Hi';})();
对于以前的版本:我能想到的立即执行它们的唯一方法是
call_user_func(function() { echo 'executed'; });
call_user_func
当然可以使用call_user_func
,但是还有另一个非常简单的选择:
<?php
// we simply need to write a simple function called run:
function run($f){
$f();
}
// and then we can use it like this:
run(function(){
echo "do something";
});
?>
run
在代码的其他部分调用您的函数,因为在立即执行该函数的行之后没有该函数的句柄。
run()
是立即执行传递给它的未命名函数。与相同call_user_func()
,仅不传递任何参数。
$f();
如果您使用的引擎未针对call_user_func
只有一个函数参数的特殊情况进行优化,则可能会更快。这是因为call_user_func
支持传递多个参数,并且它的第一个参数支持字符串作为参数或函数。就是说,如果call_user_func
可读性强,run
除非代码位于pyramind底部的某处,否则我不会使用。
run
和call_user_func
。call_user_func
相比于当有一个固有的缺点run
,因为run
只做一两件事,而call_user_func
除了支持做什么额外的功能run
一样。您可以尝试进行快速循环测试(例如),以查看引擎上的速度更快。
对于PHP 7.0或更高版本,这是最简单的。
php -r '(function() {echo 'Hi';})();'
这意味着创建闭包,然后通过“()”将其作为函数调用。由于统一的变量评估顺序,因此可以像JS一样工作。
(new ReflectionFunction(function() {
// body function
}))->invoke();
请注意,可接受的答案很好,但是它比声明一个函数并在两行中调用它的时间长1.41倍(慢41%)。
[我知道这并不是一个真正的新答案,但我觉得将其添加到访客的位置很有价值。]
细节:
<?php
# Tags: benchmark, call_user_func, anonymous function
require_once("Benchmark.php");
bench(array(
'test1_anonfunc_call' => function(){
$f = function(){
$x = 123;
};
$f();
},
'test2_anonfunc_call_user_func' => function(){
call_user_func(
function(){
$x = 123;
}
);
}
), 10000);
?>
结果:
$ php test8.php
test1_anonfunc_call took 0.0081379413604736s (1228812.0001172/s)
test2_anonfunc_call_user_func took 0.011472940444946s (871616.13432805/s)
我以这种方式进行了尝试,但是通过使用允许您首先定义函数的任何运算符(或函数),它比最佳答案更为冗长:
$value = $hack == ($hack = function(){
// just a hack way of executing an anonymous function
return array(0, 1, 2, 3);
}) ? $hack() : $hack();
call_user_func(function(){/* stuff */})
办?