🏹

PHPのアロー関数を使って可読性を向上させよう!

2023/12/20に公開

はじめに

みなさんは PHP の アロー関数 を使ったことはありますか?
アロー関数は PHP 7.4 から導入されました。コードの簡略化と可読性向上を目的として、無名関数をより簡潔に書くための新しい構文で、Closure クラスを使って実装されています。えんさがそっ♪の開発 でも可読性を意識した取り組みが行われているので、今回気になって調べてみました。

アロー関数の使い方

アロー関数は fn (argument_list) => expr という形で記述します。通常の関数は function キーワードを使用して定義され、アロー関数はより短く、単純な構文で関数を表現できます。アロー関数は単一の式を返すように設計されており、return キーワードも省略できます。

実際のコードで比較してみましょう。

単純な演算や処理の場合

// 通常の関数
$add = function ($a, $b) {
    return $a + $b;
};

// アロー関数を使う
$add = fn($a, $b) => $a + $b;

クロージャとしての利用する場合

// 通常のクロージャ
$multiply = function ($a) use ($b) {
    return $a * $b;
};

// アロー関数を使う
$multiply = fn($a) => $a * $b;

構文が簡素化されて、可読性が向上したと感じます。

注意点や制約

アロー関数は単純な処理に適していますが、複雑な処理や複数行の処理を行う場合には、通常の関数の使用を検討する必要があります。

単一行の式に制約される

アロー関数は単一行の式を返すように設計されています。これは複雑な式や制御構造を含むような複雑な処理を記述することができないという制約があります。

// 制御構造を含むアロー関数
$add = fn($a, $b) => {
  if ($a > 0) {
        return $b * 2;
  } else {
        return $b * 3;
  }
};

// Message:  syntax error, unexpected token "{"

外部変数へのアクセスに注意

この例では、アロー関数が外部変数 $a を参照しています。アロー関数の実行後に外部変数が変更されると、その変更がアロー関数内に影響を与えてしまいます。

$a = 10;

// アロー関数で外部変数にアクセス
$double = fn() => $a * 2;

// アロー関数を実行
echo $double(); // 結果は 20

// 外部変数を変更
$a = 5;

// アロー関数を再実行
echo $double(); // 結果は 10(外部変数の変更が反映される)

外部変数へのアクセスが不必要な場合は、引数として変数を渡すか、use 文を使用してクロージャで変数をキャプチャすることが推奨されます。

アロー関数の実践

それでは、実践形式で使用例を紹介していきます。

array_map関数での使用例

このコードは、与えられた $paramList 配列から id プロパティを抽出して新しい配列 $idList を作成しています。

// アロー関数を使わない
$idList = array_map(function ($param) {
    return $param->id;
}, $paramList);

// アロー関数を使う
$idList = array_map(fn($param) => $param->id, $paramList);

使用シーンは比較的多く、自分も気に入っている形です。

Laravel の Eloquent ORM での使用例

Eloquent ORM を利用して、User 情報を取得する SQL を組み立てています。

$usersQuery = User::query()
    ->when($minAge !== null, function ($query) use ($minAge) {
        $query->where('age', '>=', $minAge);
    })
    ->when($maxAge !== null, function ($query) use ($maxAge) {
        $query->where('age', '<=', $maxAge);
    });

$minAge$maxAgenull でなければ、年齢の条件式を加味しています。
これにアロー関数を使ってみると...

$usersQuery = User::query()
    ->when($minAge !== null, fn($query) => $query->where('age', '>=', $minAge))
    ->when($maxAge !== null, fn($query) => $query->where('age', '<=', $maxAge));

このように一行に収まったことで、頭の中での SQL の組み立てが容易になったと感じます。

最後に

PHP の アロー関数 については、えんさがそっ♪ の開発チームで実施している 「PHP 公式マニュアルの精読」 から得た知識になります。スキルアップの一環として、非常に有益な取り組みだと感じています。
また、他のプログラミング言語ではアロー関数に触れた経験がありましたが、PHP については機会が少なかったので、記事の執筆からしっかりと学び直すことができました。

最後までお読みいただきありがとうございました!
他のエンジニアもブログを書いているので、よかったら覗いてみてください!!

参考記事

BABY JOB  テックブログ

Discussion