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


Answers:


120

对于PHP7:请参见Yasuo Ohgaki的答案(function() {echo 'Hi';})();

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

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

12
除非引入(或直到)函数调用链接,否则这也是我的建议。
萨拉

2
@Gordon:php 5.4还是什么?
动态

@ yes123不。仍然需要使用call_user_func
Gordon

2
@BennettMcElwee让我们这样说:即使它的执行速度比define-assign-call替代方案要慢一些,但在您的应用程序中造成严重瓶颈的可能性却很小。如果有疑问,请在实际情况下对您的应用进行配置。
Gordon

谢谢@戈登,这就是我的想法。我的印象是salathe和yes123对这种方法不满意,我想知道为什么。对我来说似乎很好。
Bennett McElwee

28

PHP 7javascript中做同样的事情

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

    return 3;
})();

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

echo $gen->getReturn(), PHP_EOL;

输出为:

1
2
3

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

?>

1
我想要一个立即执行的函数,因为我定义的函数是在正常执行中不应被多次调用的函数。像您定义的那样,定义命名函数run()的问题在于,其他任何看到该代码的人都可能认为他们也可以在代码的其他部分调用run()。立即执行的功能清楚地表明该代码不应运行两次。
丹尼尔·霍华德

3
他们无法run在代码的其他部分调用您的函数,因为在立即执行该函数的行之后没有该函数的句柄。
Pacerier

3
@DanielHoward的要点run()是立即执行传递给它的未命名函数。与相同call_user_func(),仅不传递任何参数。
Cypher 2014年

1
@JordanLev,它的实现更简单(仅一行:),$f();如果您使用的引擎未针对call_user_func只有一个函数参数的特殊情况进行优化,则可能会更快。这是因为call_user_func支持传递多个参数,并且它的第一个参数支持字符串作为参数或函数。就是说,如果call_user_func可读性强,run除非代码位于pyramind底部的某处,否则我不会使用。
Pacerier's

1
@JordanLev,“简单的实现”指的是代码之间的比较内部的功能runcall_user_funccall_user_func相比于当有一个固有的缺点run,因为run只做一两件事,而call_user_func除了支持做什么额外的功能run一样。您可以尝试进行快速循环测试(例如),以查看引擎上的速度更快。
Pacerier's

11

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

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

这意味着创建闭包,然后通过“()”将其作为函数调用。由于统一的变量评估顺序,因此可以像JS一样工作。

https://3v4l.org/06EL3


2
好的答案,但是为什么要将其格式化为命令行操作呢?
Kodos Johnson


2

请注意,可接受的答案很好,但是它比声明一个函数并在两行中​​调用它的时间长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)

0

我以这种方式进行了尝试,但是通过使用允许您首先定义函数的任何运算符(或函数),它比最佳答案更为冗长:

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

2
那为什么不简单$hack = function(){...}; $hack()呢?

0

这不是直接的答案,而是一种解决方法。使用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.

-2

没有立即执行,但是接近;)

<?php

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

?>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.