最近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を使える。
