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

如何在PHP中立即执行匿名函数?,php,javascript,function,Php,Javascript,Function,在JavaScript中,您可以定义立即执行的匿名函数: (function () { /* do something */ })() 您可以在PHP中执行类似的操作吗?对于PHP7之前的版本,我能想到的唯一立即执行它们的方法是 call_user_func(function() { echo 'executed'; }); 使用当前版本的PHP,您只需 (function() { echo 'executed'; })(); 当然你可以使用,但还有一个非常简单的选择: <?php

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

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

您可以在PHP中执行类似的操作吗?

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

call_user_func(function() { echo 'executed'; });
使用当前版本的PHP,您只需

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

当然你可以使用,但还有一个非常简单的选择:

<?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";
});

?>

不立即执行,但接近;)


我这样尝试过,但它比使用任何允许您首先定义函数的运算符(或函数)的顶级答案更详细:

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

PHP7中
在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

对于PHP7.0或更高版本,这是最简单的

(function() {echo 'Hi';})();
它意味着创建闭包,然后按照“()”将其作为函数调用。由于采用了统一的变量求值顺序,其工作原理与JS类似

注意,这很好,但是它需要比声明一个函数并用两行调用它花费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>=7。使用命名方法定义匿名类,然后立即构造该类并调用该方法

$var = (new class() { // Anonymous class
    function cool() { // Named method
        return 'neato';
    }
})->cool(); // Instantiate the anonymous class and call the named method
echo $var; // Echos neato to console.

除非(或直到)被引入,否则这也是我的建议。@Gordon:PHP5.4仍然没有什么?@yes123没有。仍然必须使用
call\u user\u func
@BennettMcElwee让我们这样说:即使这比define-assign调用慢一些,但在应用程序中造成重大瓶颈的可能性非常低。如果有疑问,请在真实世界条件下评测你的应用程序。谢谢@Gordon,我就是这么想的。我得到的印象是萨拉特和耶斯123对这种方法不满意,我想知道为什么。对我来说似乎很好。我手上没有PHP5.3可以试用,但是
如何调用_user_func(function(){/*stuff*/})
呢?我想要一个立即执行的函数,因为我定义的函数在正常执行中不应该被多次调用。与您一样,定义命名函数run()的问题在于,看到代码的任何其他人都可能认为他们也可以在代码的其他部分调用run()。“立即执行”函数明确指出,此代码不应运行两次。它们不能在代码的其他部分对函数调用
run
,因为在立即执行它的行之后没有函数句柄。@DanielHoward将立即执行传递给它的未命名函数。与
call\u user\u func()
相同,只传递任何参数。@JordanLev,它有一个更简单的实现(只有一行:
$f();
),如果您使用的引擎没有针对
call\u user\u func
只有一个函数参数的特殊情况进行优化,则可能会更快。这是因为它支持传递多个参数,并且它的第一个参数支持将字符串作为参数或函数。也就是说,如果
call\u user\u func
可读性很强,我不会使用
run
,除非代码位于@JordanLev的底部。@JordanLev,“更简单的实现”是指函数
run
call\u user\u func
中的代码之间的比较<与
run
相比,code>call\u user\u func有一个固有的缺点,因为
run
只做一件事,而
call\u user\u func
除了做
run
所做的事情外,还支持其他功能。您可以尝试快速循环测试()以查看引擎上哪个更快。您可以提供更多详细信息吗?也许可以添加一个解释?那么为什么不简单地
$hack=function(){…}$hack()
?答案不错,但为什么要将其格式化为命令行操作?这样做而不是定义匿名函数有什么可能的价值?当然这是可能的,但是为什么呢?
<?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)
$var = (new class() { // Anonymous class
    function cool() { // Named method
        return 'neato';
    }
})->cool(); // Instantiate the anonymous class and call the named method
echo $var; // Echos neato to console.