web-dev-qa-db-ja.com

PHPで匿名関数をすぐに実行するにはどうすればよいですか?

JavaScriptでは、すぐに実行される匿名関数を定義できます。

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

あなたはPHPでそのようなことをすることができますか?

93
Emanuil Rusev

PHP7の場合: 大垣asu夫の答え(function() {echo 'Hi';})();

以前のバージョンの場合:すぐに実行できる唯一の方法は、

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

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
25
Wallace Maxters

もちろん、 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";
});

?>
15
Pacerier

これはPHP 7.0以降で最も単純です。

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

これはクロージャーを作成し、「()」に従って関数として呼び出すことを意味します。統一された変数評価順序のおかげで、JSと同じように機能します。

https://3v4l.org/06EL

9
Yasuo Ohgaki
(new ReflectionFunction(function() {
 // body function
}))->invoke();
6
innermond

受け入れられた答え は問題ありませんが、関数を宣言して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)
1
Shovas

この方法で試してみましたが、最初に関数を定義できる演算子(または関数)を使用することで、トップアンサーよりも冗長になります。

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

これは直接的な答えではなく、回避策です。 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.
0