最近phpやLaravelを触っておらず、久しぶりにLaravelで開発していると、matchという使用経験がないものを見つけたのでメモ

match式とは

match 式は、値の一致をチェックした結果に基づいて評価結果を分岐します。 switch 文と似ていますが、 match 式は複数の候補と比較される制約式を持ちます。 switch 文とは異なり、 三項演算子のように値を評価します。 switch 文とは異なり、 弱い比較(==)ではなく、 型と値の一致チェック(===) に基づいて行われます。 match 式は PHP 8.0.0 以降で利用可能です。

ドキュメント

またswitch文では弱い比較(==)だったのに対し、match式は型と値の一致チェック(===) に基づいて行わるそう。

基本的な構文をざっと頭に入れて以下のようにコードを書いてみた。

// 指定ユーザー以外のクエリ取得
$query = $this->userRepository->queryExcludingUser($currentUserId);

match ($filter) {
  'same_target' => $currentUserTargetTime
    // 同じ目標時間のユーザーでフィルタ
    ? $this->userRepository->filterBySameTargetTime($query, $currentUserTargetTime)
    : $query,
  'following' => $this->userRepository->filterByFollowing($query, $currentUserId),
  default => $query,
};

制約式とマッチする条件式に対応する返却式が返り値としてreturnされるが、今回の実装では$queryをrepository層でフィルタしているので、値を受け取る必要なし

条件式ではすべてのパターンを網羅する必要があるみたいですが、switch文の如くdefaultを使える。