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


96

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

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

PHPでそのようなことができますか?


2
試用するためのphp 5.3を手に持っていませんが、どうすれcall_user_func(function(){/* stuff */})ばよいですか?
Jasper

回答:


120

PHP7の場合:大垣康雄の回答を参照してください。(function() {echo 'Hi';})();

以前のバージョンの場合:私が考えることができるそれらをすぐに実行する唯一の方法は

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

12
関数呼び出しの連鎖が導入されない限り(またはそれまで)、これも私の提案です。
10

2
@Gordon:php 5.4まだ何もない?
動的な

@ yes123いいえ。まだ使用する必要がありますcall_user_func
Gordon

2
@BennettMcElweeをこのようにしてみましょう。これがdefine-assign-callの代替よりもいくらか遅い場合でも、これがアプリケーションに重大なボトルネックをもたらす可能性は非常に低くなります。疑わしい場合は、実際の状況でアプリのプロファイルを作成してください。
ゴードン

@Gordonに感謝します。salatheとyes123はこの方法に満足していないという印象を受け、その理由を知りました。私には完璧に思えます。
Bennett McElwee 2013年

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
私が定義している関数は、通常の実行で2回以上呼び出されることがない関数であるため、すぐに実行する関数が必要です。名前付き関数run()を定義する場合の問題は、コードと同じように、コードの他の部分でもrun()を呼び出すことができると考える人がいるかもしれません。即時実行関数は、このコードを2回実行してはならないことを明確にします。
ダニエルハワード

3
runコードの他の部分で関数を呼び出すことはできません。これは、関数をすぐに実行する行の後に関数へのハンドルが存在しないためです。
Pacerier 2013

3
@DanielHowardのポイントはrun()、渡された名前のない関数をすぐに実行することです。と同様にcall_user_func()、パラメータは渡されません。
サイファー

1
@JordanLev、それはより単純な実装(たった1行:)であり、$f();使用するエンジンがcall_user_func関数の引数が1つしかない特殊な場合に最適化されていない場合は高速になる可能性があります。これは、call_user_func複数のパラメーターの受け渡しをサポートし、その最初の引数が引数としての文字列または関数のいずれかをサポートするためです。とは言っても、コードがpyramindの下部のどこかに配置されていない限り、call_user_func読みやすい場合は使用しません。run
Pacerier

1
@JordanLev、「単純なインプリメンテーション」コードとの比較を指す内部機能runcall_user_funccall_user_funcは1つのことしか実行しないrunため、と比較すると固有の欠点がありますが、実行することに加えて追加の機能をサポートします。あなたはあなたのエンジンでどちらが速いかを確かめるためにクイックループテスト(例えば)を試すことができます。runcall_user_funcrun
Pacerier、

11

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

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

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

https://3v4l.org/06EL3


2
良い答えですが、なぜそれをコマンドライン操作としてフォーマットするのですか?
Kodos Johnson 2019


2

注意、受け入れられた答え結構ですが、それは関数を宣言し、二行でそれを呼び出すよりも長く(遅く41%)として1.41xかかります。

[本当に新しい答えではないことは知っていますが、訪問者にとってどこかにこれを追加することは価値があると感じました。]

詳細:

<?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();

?>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.