## アロー関数

アロー関数は 無名関数 を簡潔に書ける文法として PHP 7.4 で追加されました。

無名関数とアロー関数は共に Closure クラスを使って実装されています。

アロー関数は `fn (argument_list) => expr` という形で記述します。

アロー関数は 無名関数 と同じ機能をサポートしていますが、 親のスコープで使える変数が常に自動で使える点だけが異なります。

式の中で使える変数が親のスコープで定義されている場合、 暗黙のうちに参照ではなく値がキャプチャされます。 次の例では、$fn1 と $fn2 は同じ振る舞いをします。

例1 アロー関数は参照ではなく値を自動でキャプチャする

    <?php
    $y = 1;

    $fn1 = fn($x) => $x + $y;
    // $y を値渡しするのと同じ
    $fn2 = function ($x) use ($y) {
        return $x + $y;
    };

    var_export($fn1(3));

上の例の出力は以下となります。

    4

この仕組みは、アロー関数をネストした場合でも同じ動きをします:

例2 アロー関数は、ネストされた場合でも変数を値でキャプチャする

    <?php
    $z = 1;
    $fn = fn($x) => fn($y) => $x * $y + $z;
    // 51 を出力
    var_export($fn(5)(10));

無名関数と同じように、 アロー関数の文法は、パラメータや戻り値、デフォルト値、可変長引数、 リファレンス渡しやリファレンス返しを含む、任意の関数シグネチャを扱えます。 次に示す例は、全て正しいアロー関数の例です:

例3 アロー関数の例

    <?php
    fn(array $x) => $x;
    static fn($x): int => $x;
    fn($x = 42) => $x;
    fn(&$x) => $x;
    fn&($x) => $x;
    fn($x, ...$rest) => $rest;

アロー関数は変数を値でバインドします。 これは変数 $x をアロー関数の内部で使うたびに `use($x)` を実行することと大体同じです。 値でバインドするということは、アロー関数の外のスコープの値を変更することが不可能だということです。 参照でバインドしたい場合は、無名関数 が使えます。

例4 外部のスコープの値はアロー関数では変更できない

    <?php
    $x = 1;
    $fn = fn() => $x++; // 意味がない
    $fn();
    var_export($x);  // 1 を出力

### 変更履歴

バージョン | 説明
--- | ---
7.4.0 | アロー関数が利用可能になりました。

### 注意

> 注意: アロー関数の内部から func_num_args()、 func_get_arg() および func_get_args() を使用することができます。

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open