ホームページ >バックエンド開発 >PHP7 >詳細 ---PHP 7.4 の新しいアロー関数

詳細 ---PHP 7.4 の新しいアロー関数

花姐姐
花姐姐転載
2020-05-06 09:57:242843ブラウズ

詳細 ---PHP 7.4 の新しいアロー関数

短いクロージャ (アロー関数とも呼ばれる) は、PHP で書かれた短い関数です。この関数は、 array_map## を使用するなど、クロージャを関数に渡すときに非常に役立ちます。 # または array_filter 関数。

これは次のようになります:

// Post 对象的集合
$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 つあります:

展開演算子 Reference の使用も許可され、両方のパラメータは次のとおりです。戻り値として使用されます

結果を参照によって返したい場合は、次の構文を使用する必要があります:

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 変数には影響しないことを意味します。

もちろん、例外はあります。それは、通常のクロージャと同じ機能を持つ $this キーワードです。

array_map(fn($x) => $x * $this->modifier, $numbers);

開発の見通し

私はすでに複数行のクロージャは、まだ将来的に開発の可能性があると述べました。私の頭の中にあるもう 1 つのアイデアは、ゲッター関数やセッター関数などの短いクロージャをクラスで使用できるようにすることです。

class Post {
  private $title;
  fn getTitle() => $this->title;
}

要するに、短いクロージャは次のとおりです。非常に人気のある機能ですが、改善が必要な部分はたくさんあります。最も可能性が高いのは複数行のクロージャです。

推奨される学習:
PHP ビデオ チュートリアル

以上が詳細 ---PHP 7.4 の新しいアロー関数の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はjb51.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。