(jp) =
アロー関数とも呼ばれる短いクロージャは、PHP で短い関数を記述する方法です。 この表記法は、次のような関数にクロージャーを渡すときに役立ちます。 array_map
また array_filter
.
これは彼らがどのように見えるかです:
$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 表現; 書式設定のために 1 つの式が複数行にまたがることがありますが、常に 1 つの式でなければなりません。
理由は次のとおりです。短いクロージャの目的は、冗長性を減らすことです。
fn
もちろん、より短いです function
すべての場合において。 しかし、RFC の作成者である Nikita Popov は、複数行の関数を扱っている場合、短いクロージャを使用しても得られるものは少ないと主張しました。
結局のところ、複数行のクロージャーは定義上、すでにより冗長です。 そのため、2 つのキーワードをスキップできます (function
と return
) あまり変わらないでしょう。
この感情に同意するかどうかはあなた次第です。 私のプロジェクトでは多くの 1 行のクロージャーが考えられますが、複数行のクロージャーもたくさんあります。個人的には、そのような場合に短い構文が恋しくなります。
ただし、希望はあります。将来、複数行の短いクロージャを追加することは可能ですが、それ自体は RFC です。
# 外側のスコープからの値
短いクロージャと通常のクロージャのもう 1 つの重要な違いは、短いクロージャでは use
外部スコープからデータにアクセスできるようにするためのキーワード。
$modifier = 5;
array_map(fn($x) => $x * $modifier, $numbers);
外側のスコープから変数を変更することは許可されていないことに注意することが重要です。 値は、参照ではなく値によってバインドされます。 これは、あなたが できる 変化する $modifier
短い閉鎖の中で、それは影響を与えませんでした $modifier
外側のスコープの変数。
1 つの例外はもちろん、 $this
通常のクロージャーとまったく同じように機能するキーワード:
array_map(fn($x) => $x * $this->modifier, $numbers);
# 将来の可能性
複数行の短いクロージャについてはすでに述べましたが、これはまだ将来の可能性です。 浮かんでいる別のアイデアは、たとえばゲッターとセッターのクラスで短いクロージャー構文を許可することです。
class Post
private $title;
fn getTitle() => $this->title;
全体として、短い閉鎖は歓迎すべき機能ですが、まだ改善の余地があります. 最大のものは、おそらく複数行の短いクロージャーです。
共有したい考えはありますか? お気軽に つぶやき または私の方法で電子メールを送ってください!