PHPのアロー関数とは何か、書き方や使い方について

採用はこちら

PHPのアロー関数とは、短い無名関数を簡潔に記述するための構文です。
PHP 7.4から利用できるようになり、fnキーワードを使って記述します。

通常の無名関数ではfunctionreturnなどを書く必要がありますが、アロー関数では処理をより短くまとめられます。

特に、array_map()array_filter()などのコールバック関数を記述するときに便利です。

基本構文は次のとおりです。

fn(引数) => 式

例えば、受け取った数値を2倍にする場合は次のように記述します。

$double = fn($number) => $number * 2;

echo $double(5);

実行結果は次のとおりです。

10

同じ処理を通常の無名関数で書くと、次のようになります。

$double = function ($number) {
    return $number * 2;
};

アロー関数を利用すると、次のように短くできます。

$double = fn($number) => $number * 2;

このように、単純な処理をコンパクトに記述できることがアロー関数の大きな特徴です。

目次

PHPのアロー関数の基本的な書き方

fnキーワードを使用する

PHPのアロー関数では、通常の無名関数で使用するfunctionの代わりにfnを使用します。

例えば、数値を2乗するアロー関数は次のように書けます。

$square = fn($number) => $number * $number;

echo $square(5);

実行結果は次のとおりです。

25

アロー関数の構造を分解すると、次のようになります。

fn($number) => $number * $number

fnはアロー関数を宣言するキーワードです。

($number)には関数が受け取る引数を指定します。

=>の右側には、アロー関数で実行する式を記述します。

returnを記述する必要がない

アロー関数では、=>の右側に記述した式の評価結果がそのまま戻り値になります。

そのため、通常の関数のようにreturnを書く必要はありません。

例えば次のコードです。

$add = fn($a, $b) => $a + $b;

echo $add(10, 20);

実行結果は次のとおりです。

30

通常の無名関数では次のように書きます。

$add = function ($a, $b) {
    return $a + $b;
};

アロー関数ではreturnを省略できるため、短い処理を簡潔に記述できます。

PHPのアロー関数と無名関数の違い

PHPのアロー関数は、通常の無名関数を単純に短くしただけではありません。

外側の変数の取り込み方や、本体として記述できる内容にも違いがあります。

コードを短く書ける

通常の無名関数は次のように記述します。

$greeting = function ($name) {
    return 'Hello, ' . $name;
};

アロー関数では次のように記述できます。

$greeting = fn($name) => 'Hello, ' . $name;

処理内容が単純であれば、アロー関数を使うことでコードをすっきりまとめられます。

外側の変数を自動的に取り込める

アロー関数の大きな特徴の一つが、外側のスコープにある変数を自動的に取り込めることです。

例えば次のコードがあります。

$taxRate = 0.1;

$calculateTax = fn($price) => $price * $taxRate;

echo $calculateTax(1000);

実行結果は次のとおりです。

100

$taxRateはアロー関数の引数として渡していませんが、外側で定義されているため利用できます。

通常の無名関数では、外側のローカル変数を利用するときにuseを記述する必要があります。

$taxRate = 0.1;

$calculateTax = function ($price) use ($taxRate) {
    return $price * $taxRate;
};

アロー関数なら次のように簡潔に書けます。

$calculateTax = fn($price) => $price * $taxRate;

外側の変数は値として取り込まれる

アロー関数では、外側の変数は基本的に値渡し相当で自動的にキャプチャされます。

例えば次のコードです。

$x = 10;

$func = fn() => $x;

$x = 20;

echo $func();

実行結果は次のとおりです。

10

アロー関数が作成された時点の$xの値が取り込まれているためです。

一方、通常の無名関数では、use&を組み合わせることで外側の変数を参照として取り込めます。

$x = 10;

$func = function () use (&$x) {
    return $x;
};

$x = 20;

echo $func();

この場合の実行結果は次のようになります。

20

アロー関数には、通常の無名関数におけるuse (&$x)のように、外側のローカル変数を明示的に参照キャプチャする構文はありません。

PHPのアロー関数で引数を使う方法

引数を1つ指定する

もっとも基本的なのが、引数を1つ受け取るアロー関数です。

$double = fn($value) => $value * 2;

echo $double(10);

実行結果は次のとおりです。

20

複数の引数を指定する

アロー関数には複数の引数を指定することもできます。

$multiply = fn($a, $b) => $a * $b;

echo $multiply(5, 4);

実行結果は次のとおりです。

20

引数と戻り値に型を指定する

PHPのアロー関数では、通常の関数と同じように型宣言を利用できます。

例えば、引数にint型を指定する場合は次のとおりです。

$double = fn(int $number) => $number * 2;

戻り値の型も指定できます。

$double = fn(int $number): int => $number * 2;

型を指定すると、関数がどのような値を受け取り、どのような値を返すのかを明確にできます。

デフォルト値を指定する

引数にはデフォルト値を設定することもできます。

$greet = fn(string $name = 'Guest'): string => 'Hello, ' . $name;

echo $greet();

実行結果は次のとおりです。

Hello, Guest

array_mapでアロー関数を使う方法

配列の値を変換する

アロー関数が特に活用されるのが、配列関数のコールバックです。

array_map()は、配列の各要素に指定した処理を適用する関数です。

例えば配列内の数値をすべて2倍にする場合は、次のように記述できます。

$numbers = [1, 2, 3, 4, 5];

$result = array_map(
    fn($number) => $number * 2,
    $numbers
);

print_r($result);

実行結果は次のとおりです。

Array
(
    [0] => 2
    [1] => 4
    [2] => 6
    [3] => 8
    [4] => 10
)

単純な値の変換では、アロー関数を使うことで処理内容を一目で把握しやすくなります。

array_filterでアロー関数を使う方法

条件に一致する要素だけを取得する

array_filter()は、条件に一致する配列要素だけを残すときに使用します。

例えば偶数だけを抽出する場合は次のとおりです。

$numbers = [1, 2, 3, 4, 5, 6];

$evenNumbers = array_filter(
    $numbers,
    fn($number) => $number % 2 === 0
);

print_r($evenNumbers);

結果は次のようになります。

Array
(
    [1] => 2
    [3] => 4
    [5] => 6
)

array_filter()では、元の配列のキーが基本的に維持されます。

そのため、キーを0から連番に振り直したい場合はarray_values()を組み合わせます。

$evenNumbers = array_values(
    array_filter(
        $numbers,
        fn($number) => $number % 2 === 0
    )
);

結果は次のとおりです。

Array
(
    [0] => 2
    [1] => 4
    [2] => 6
)

usortでアロー関数を使う方法

配列を並べ替える

アロー関数は、usort()の比較処理にも利用できます。

例えば数値を昇順に並べる場合は次のとおりです。

$numbers = [5, 2, 8, 1, 3];

usort(
    $numbers,
    fn($a, $b) => $a <=> $b
);

print_r($numbers);

実行結果は次のようになります。

Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 5
    [4] => 8
)

<=>は、PHPの宇宙船演算子と呼ばれる比較演算子です。

左側が小さければ負の値、等しければ0、大きければ正の値を返すため、並べ替えの比較処理に適しています。

アロー関数で配列データを処理する方法

特定の値だけを取り出す

Webアプリケーションでは、連想配列から特定の値だけを取得するときにもアロー関数を活用できます。

例えば次の商品データがあるとします。

$products = [
    ['name' => 'Apple', 'price' => 150],
    ['name' => 'Orange', 'price' => 200],
    ['name' => 'Banana', 'price' => 100],
];

価格だけを取り出す場合は次のように書けます。

$prices = array_map(
    fn($product) => $product['price'],
    $products
);

print_r($prices);

実行結果は次のとおりです。

Array
(
    [0] => 150
    [1] => 200
    [2] => 100
)

外部変数を使って絞り込む

外側で定義した変数を利用して商品を絞り込むこともできます。

$minPrice = 150;

$filteredProducts = array_filter(
    $products,
    fn($product) => $product['price'] >= $minPrice
);

この例では、アロー関数の外側で定義した$minPriceを自動的に取り込んでいます。

アロー関数の特徴を活かした代表的な使用方法です。

クラス内でアロー関数を使う方法

$thisを利用する

クラス内の非staticなコンテキストで作成されたアロー関数では、通常$thisも利用できます。

class PriceCalculator
{
    private float $taxRate = 0.1;

    public function calculate(array $prices): array
    {
        return array_map(
            fn($price) => $price * (1 + $this->taxRate),
            $prices
        );
    }
}

この例では、アロー関数の中からクラスのプロパティである$this->taxRateを参照しています。

オブジェクト指向のPHPでも、配列処理などの短いコールバックで便利に利用できます。

PHPのアロー関数でできないこと

本体には単一の式を記述する

PHPのアロー関数について理解するうえで重要なのが、本体は単一の式で構成されるという点です。

例えば、通常の無名関数では次のように複数の文を記述できます。

$func = function ($number) {
    $result = $number * 2;
    echo $result;

    return $result;
};

これと同じように、アロー関数の右側へ文のブロックを書くことはできません。

// この書き方はできない
$func = fn($number) => {
    $result = $number * 2;

    return $result;
};

アロー関数では次のように、1つの式を指定します。

$func = fn($number) => $number * 2;

ここで重要なのは「1行しか書けない」という意味ではないことです。

構文上、アロー関数の本体として指定できるのが単一の式であるという意味です。

複数の代入処理や複雑な制御処理が必要な場合は、通常の無名関数や名前付き関数を使うほうが適しています。

三項演算子とアロー関数を組み合わせる方法

簡単な条件分岐を記述する

アロー関数の右側には式を指定できるため、三項演算子も利用できます。

$checkAge = fn($age) => $age >= 18 ? '成人' : '未成年';

echo $checkAge(20);

実行結果は次のとおりです。

成人

簡単な条件分岐であれば、アロー関数と三項演算子を組み合わせることで短く記述できます。

ただし、三項演算子を何重にもネストすると可読性が低下するため注意が必要です。

match式とアロー関数を組み合わせる方法

複数の値を判定する

PHP 8.0以降では、match式とアロー関数を組み合わせることもできます。

$getStatus = fn($status) => match ($status) {
    1 => '公開',
    2 => '非公開',
    3 => '下書き',
    default => '不明',
};

echo $getStatus(1);

実行結果は次のとおりです。

公開

matchは文ではなく式であるため、アロー関数の右側に記述できます。

複数の条件から値を選択する処理では便利な組み合わせです。

PHPのアロー関数を使うメリット

コードを簡潔にできる

アロー関数の最大のメリットは、短い関数をコンパクトに記述できることです。

fn($x) => $x * 2

通常の無名関数では次のようになります。

function ($x) {
    return $x * 2;
}

コールバック関数が多く登場する処理では、アロー関数を使うことでコード全体をすっきりさせられます。

配列処理を読みやすくできる

例えば次のコードです。

$result = array_map(
    fn($number) => $number * 2,
    $numbers
);

「各要素を2倍にする」という処理内容をすぐに把握できます。

短い変換処理や条件判定では、アロー関数を使うことで意図が明確になる場合があります。

useを省略できる

アロー関数では、外側の変数を自動的に取り込めます。

$rate = 1.1;

$prices = array_map(
    fn($price) => $price * $rate,
    $prices
);

通常の無名関数では次のようにuseが必要です。

$prices = array_map(
    function ($price) use ($rate) {
        return $price * $rate;
    },
    $prices
);

外側の値を参照する短いコールバックでは、アロー関数のほうが簡潔です。

PHPのアロー関数を使う際の注意点

複雑なロジックを詰め込みすぎない

アロー関数は短い処理に適しています。

複雑な条件分岐を無理に1つの式へまとめると、かえって読みにくくなる場合があります。

例えば次のようなコードです。

$func = fn($x) => $x > 100
    ? 'A'
    : ($x > 50
        ? 'B'
        : ($x > 10 ? 'C' : 'D'));

構文上記述できても、条件が増えるほど理解しにくくなります。

このような場合は、通常の無名関数や名前付き関数に分けたほうが保守しやすくなります。

PHP 7.3以前では利用できない

アロー関数はPHP 7.4で導入された機能です。

そのため、PHP 7.3以前では次の構文は利用できません。

fn($x) => $x * 2;

なお、PHP 7.x系はすでに公式サポートが終了しています。

2026年8月時点ではPHP 8.2、8.3、8.4、8.5が公式サポート対象となっているため、新規開発では使用するフレームワークやライブラリの対応状況を確認しながら、サポート中のPHP 8.x系を選択することが重要です。

PHPのアロー関数と=>の違い

配列でも=>が使われる

PHPでは、=>がアロー関数以外でも使われます。

例えば連想配列では次のように記述します。

$user = [
    'name' => 'Taro',
    'age' => 30,
];

この場合の=>は、配列のキーと値を関連付けるために使用されています。

一方、アロー関数では次のように使用します。

$double = fn($x) => $x * 2;

こちらの=>は、fn(引数) => 式というアロー関数構文の一部です。

同じ記号でも役割が異なるため、前後の構文から判断する必要があります。

PHPのアロー関数はどのような場面で使うべきか

短いコールバック処理に向いている

PHPのアロー関数は、1つの式で表現できる短い処理に適しています。

代表的な用途として、次のようなものがあります。

  • array_map()による値の変換
  • array_filter()によるデータの絞り込み
  • usort()などで使う比較関数
  • 簡単な計算処理
  • 短い条件判定
  • 外側の変数を利用するコールバック
  • クラス内の短い配列処理

例えば、ユーザー名だけを取り出す場合は次のように書けます。

$names = array_map(
    fn($user) => $user['name'],
    $users
);

一方で、複数段階の条件分岐、変数への代入、例外処理、ログ出力などが必要になる場合は、通常の無名関数や名前付き関数を検討したほうがよいでしょう。

PHPのアロー関数と無名関数の使い分け

短い処理ならアロー関数を使う

単純な値の変換や条件判定では、アロー関数が適しています。

$names = array_map(
    fn($user) => $user['name'],
    $users
);

記述が短く、何をしているコードなのかも把握しやすくなります。

複雑な処理なら無名関数を使う

複数の処理を行う必要がある場合は、通常の無名関数のほうが適しています。

$results = array_map(
    function ($user) {
        $name = trim($user['name']);

        if ($name === '') {
            return '名前未設定';
        }

        return strtoupper($name);
    },
    $users
);

このような処理をアロー関数へ無理にまとめると、かえって可読性を低下させる可能性があります。

アロー関数を使用するかどうかは、単にコードが短くなるかではなく、処理内容が分かりやすくなるかどうかを基準に判断するとよいでしょう。

PHPのアロー関数についてのまとめ

PHPのアロー関数は、PHP 7.4で導入された、短い無名関数を簡潔に記述するための構文です。

基本的には次のように記述します。

fn($引数) => 式

=>の右側に指定した式の評価結果がそのまま戻り値になるため、returnを記述する必要はありません。

また、通常の無名関数と異なり、外側のローカル変数をuseなしで自動的に取り込めることも大きな特徴です。

特にarray_map()array_filter()usort()などのコールバックでは、処理を簡潔に記述できます。

一方で、アロー関数の本体には単一の式しか指定できません。

複数の処理や複雑なロジックが必要な場合は、通常の無名関数や名前付き関数のほうが適しています。

PHPのアロー関数は、短く単純な処理を分かりやすく表現するための機能として活用することが重要です。

以上、PHPのアロー関数とは何か、書き方や使い方についてでした。

最後までお読みいただき、ありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次