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

 
                
この投稿へのコメント