アロー関数とも呼ばれる短いクロージャは、PHP で短い関数を記述する方法です。この表記は、array_map や array_filter などの関数にクロージャを渡すときに便利です。
これらは次のようになります:
// A collection of Post objects $posts = [/* … */]; $ids = array_map(fn($post) => $post->id, $posts);
その前は、次のように記述する必要がありました:
$ids = array_map(function ($post) { return $post->id; }, $posts);
短いクロージャの使用方法をまとめてみましょう。
# PHP 7.4 以降で使用可能
# fn キーワードで始まります
# 式は 1 つだけ含めることができ、return ステートメント
# return ステートメントキーワードは許可されていません
#● パラメータと戻り値の型は型ヒントにすることができます上記の例をより厳密に型指定して記述する方法は、次のようになります。$ids = array_map(fn(Post $post): int => $post->id, $posts);あと 2 つ挙げておきます。 : # スプレッド演算子が許可されます # 参照が許可され、両方のパラメータを戻り値として使用できます 値を参照によって返したい場合は、次の構文を使用する必要があります:
fn&($x) => $xつまり、短いクロージャは、式を 1 つだけ許可することを除いて、通常のクロージャと同じ機能を持ちます。
# 複数行は禁止
そのとおりです。短いクロージャには式を 1 つだけ含めることができます。つまり、複数行を含めることはできません。 理由は次のとおりです: 短いクロージャの目的は、冗長性を減らすことです。もちろん、fn はどの場合でも function よりも短くなります。ただし、RFC の作成者 Nikita Popov は、複数行の関数を扱う場合、短いクロージャを使用しても得られるメリットは少ないと考えています。 結局のところ、複数行のクロージャは定義上すでに冗長であるため、2 つのキーワード (function と return) をスキップできても大きな違いはありません。 この見解に同意するかどうかはあなた次第です。私のプロジェクトには単一行のクロージャがたくさんあると思いますが、複数行のクロージャもたくさんあります。そのような場合、私は個人的に短い構文を見逃します。 ただし、希望はあります。将来的には短い複数行のクロージャを追加できる可能性がありますが、これは単なる RFC です。# 外部スコープからの値
短いクロージャと通常のクロージャのもう 1 つの大きな違いは、短いクロージャではアクセスするために use キーワードが必要ないことです。外部スコープのデータにアクセスします。$modifier = 5; array_map(fn($x) => $x * $modifier, $numbers);外部スコープ内の変数は変更できないことに注意してください。値は値に束縛され、参照に束縛されません。これは、外側のスコープ内の $modifier 変数には影響しませんが、短いクロージャ内で $modifier を変更できることを意味します。 もちろん、1 つの例外は $this キーワードで、これは通常のクロージャとまったく同じように機能します。
array_map(fn($x) => $x * $this->modifier, $numbers);##将来の可能性
#I複数行のショート クロージャについてはすでに述べましたが、これは将来的にも可能性があります。
もう 1 つのアイデアは、クラス内でゲッターやセッターなどの短いクロージャ構文を許可することです。class Post { private $title; fn getTitle() => $this->title; }全体として、短いクロージャは歓迎すべき機能ですが、まだ改善の余地があります。最大のものはおそらく複数行の短いクロージャーです。
翻訳: https://stitcher.io/blog/short-closures-in-php
以上がPHP 7.4 のアロー関数の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。