さまざまなコーディング例で、関数を作成するときのさまざまなコーディング スタイルを見てきました。
を使用して関数を作成することの違いは何ですか
$provider = function() { code here }
対
function provider(){ code here }
最初の例は単に次の短いバージョン$data = provider();
ですか?
最初の例はいつ使用しますか?
いいえ、そうではありません。最初のコードはクロージャーの宣言、つまり無名関数です。名前はなく、それを保持する識別子で呼び出すことができます。2番目のサンプルは通常の関数(より具体的にはユーザー定義関数)であり、その名前を介してすべてのスコープ内でアクセスできます-クロージャとは異なり、定義されたスコープ内でのみ呼び出すことができます。
クロージャーは好きなだけ持つことができます - それらは単なる呼び出し可能なエンティティです。たとえば、これは有効です:
$provider = function() { Code here }
$another = function() { Code here } //same code
- 呼び出し$provider
(たとえば、call_user_func()を使用) は、何の関係もありません。$another
もう 1 つの重要な違いは、クロージャーが次のようなコンテキスト パラメーターを受け入れることができることです。
$provider = function() use ($param1, $param2, ...) { Code here }
-本体内でコンテキストパラメータが利用可能になります。コンテキスト パラメーターは通常の引数とは異なります。コンテキスト パラメーターは定義されており、クロージャから独立して存在し、呼び出しが発生した時点で引数が評価されるためです。
最初の宣言は無名関数です。代入後、$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