php8で新たに採用されたmatch式と switch文の記述違い サクッと説明
php8から使用可能になったmatch式の説明です。尚、自社サーバーは7系だったのでローカルで試しました。
書き方の違い
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
switch ($statusCode) { case 200: case 300: $message = null; break; case 400: $message = 'not found'; break; case 500: $message = 'server error'; break; default: $message = 'unknown status code'; break; } $message = match ($statusCode) { 200, 300 => null, 400 => 'not found', 500 => 'server error', default => 'unknown status code', }; |
match式は
・breakがいらない
・返り値があるので、指定するのは一度だけ
1 2 3 4 5 6 7 8 9 10 11 |
$statusCode = '200'; $message = match ($statusCode) { 200 => null, default => 'unknown status code', }; // 'unknown status code' |
厳密な比較なので上記ではdefaultのvalueが返されます。
1 2 3 4 5 6 7 8 |
$statusCode = 400; $message = match ($statusCode) { 200 => 'perfect', }; // UnhandledMatchError |
switch文だとスルーしてしまうケースでもエラーを返します。
1 2 3 4 |
$message = [ $this->matchesRegex($line) => 'match A', $this->matchesOtherRegex($line) => 'match B', ][$line] ?? 'no match'; |
どうやらmatch式を採用するにあたり、上記の書き方が出来てしまうことで最初に全パターンの正規表現関数が実行されパフォーマンスが落ちるので反対意見もあったそうです。
厳密な比較になりますので既存のコードをいきなりmatch式で書き直すと色々事故が起きそうなので、採用するにはまずは型比較を見直した方がよさそうです。
この投稿へのトラックバック
トラックバックはありません。
- トラックバック URL
この投稿へのコメント