ホームページ  >  記事  >  バックエンド開発  >  PHP 7.4 のアロー関数

PHP 7.4 のアロー関数

藏色散人
藏色散人オリジナル
2019-11-30 11:58:514648ブラウズ

アロー関数とも呼ばれる短いクロージャは、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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。