如何在PHP中立即执行匿名函数?

时间:2010-08-25 16:58:54

标签: php javascript function

在JavaScript中,您可以定义立即执行的匿名函数:

(function () { /* do something */ })()

你可以在PHP中做类似的事吗?

9 个答案:

答案 0 :(得分:113)

对于PHP7:请参阅Yasuo Ohgaki's answer(function() {echo 'Hi';})();

对于以前的版本:我能想到的唯一方法是立即执行它们

call_user_func(function() { echo 'executed'; });

答案 1 :(得分:24)

PHP 7中是在javascript中执行相同操作

$gen = (function() {
    yield 1;
    yield 2;

    return 3;
})();

foreach ($gen as $val) {
    echo $val, PHP_EOL;
}

echo $gen->getReturn(), PHP_EOL;

输出结果为:

1
2
3

答案 2 :(得分:15)

当然你可以使用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";
});

?>

答案 3 :(得分:8)

对于PHP 7.0或更高版本,这是最简单的。

php -r '(function() {echo 'Hi';})();'

这意味着创建闭包,然后通过跟随“()”将其称为函数。由于统一的变量评估顺序,它就像JS一样工作。

https://3v4l.org/06EL3

答案 4 :(得分:6)

(new ReflectionFunction(function() {
 // body function
}))->invoke();

答案 5 :(得分:1)

注意,accepted answer没问题,但它比宣布一个函数并用两行调用它需要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)

答案 6 :(得分:0)

我用这种方式试了一下,但是通过使用任何允许你首先定义函数的运算符(或函数),它比最顶层的答案更冗长:

    $value = $hack == ($hack = function(){
            // just a hack way of executing an anonymous function
            return array(0, 1, 2, 3);                
    }) ? $hack() : $hack();

答案 7 :(得分:0)

这不是直接的答案,而是一种解决方法。使用PHP> =7。使用命名方法定义匿名类,并构造该类并立即调用该方法。

public function survey($survey_id)
{
    $this->load->view('products/survey', $survey_id);
}

答案 8 :(得分:-2)

不立即执行,但接近;)

<?php

$var = (function(){ echo 'do something'; });
$var();

?>