2

さまざまなコーディング例で、関数を作成するときのさまざまなコーディング スタイルを見てきました。

を使用して関数を作成することの違いは何ですか

$provider = function() { code here }

function provider(){ code here }

最初の例は単に次の短いバージョン$data = provider();ですか?
最初の例はいつ使用しますか?

4

2 に答える 2

3

いいえ、そうではありません。最初のコードはクロージャーの宣言、つまり無名関数です。名前はなく、それを保持する識別子で呼び出すことができます。2番目のサンプルは通常の関数(より具体的にはユーザー定義関数)であり、その名前を介してすべてのスコープ内でアクセスできます-クロージャとは異なり、定義されたスコープ内でのみ呼び出すことができます。

クロージャーは好きなだけ持つことができます - それらは単なる呼び出し可能なエンティティです。たとえば、これは有効です:

$provider = function() { Code here }
$another  = function() { Code here } //same code

- 呼び出し$provider(たとえば、call_user_func()を使用) は、何の関係もありません。$another

もう 1 つの重要な違いは、クロージャーが次のようなコンテキスト パラメーターを受け入れることができることです。

$provider = function() use ($param1, $param2, ...) { Code here }

-本体内でコンテキストパラメータが利用可能になります。コンテキスト パラメーターは通常の引数とは異なります。コンテキスト パラメーターは定義されており、クロージャから独立して存在し、呼び出しが発生した時点で引数が評価されるためです。

于 2013-10-31T10:50:11.557 に答える
0

最初の宣言は無名関数です。代入後、$provider という名前の変数があり、$provider() を呼び出すことができます。2 番目の宣言は通常の関数です。匿名関数は、たとえばarray_map、array_filterでユーザーにすることができます.たとえば

$a = array(1, 2, 3, 4, 5);
$res = array_filter(
    $a, function ($elem) {
        return $elem > 3;
    }
);
print_r($res);

出力要素 who より大きい 3

于 2013-10-31T11:05:32.947 に答える