章: 第1章: 文法の土台
switch文のbreak忘れやゆるい型比較に悩んでいませんか?
PHP 8で導入された match 式は、switch文の課題を解消した新しい分岐構文です。型まで厳密に比較し、戻り値として扱えて、breakも不要。短くて安全なコードが書けるようになります。
まずコードを動かしてみる
<?php
$status = 200;
$message = match ($status) {
200 => 'OK',
404 => 'Not Found',
default => 'Unknown',
};
echo $message;
match は式なので、結果を変数に代入できます。breakを書く必要はありません。
switch文 vs match式の比較
| 比較項目 | switch文 | match式 |
| 型比較 | ==(緩い) |
===(厳密) |
| 戻り値 | なし | あり(式として使える) |
| break | 必要 | 不要 |
| fall-through | ある(break忘れに注意) | なし |
| 未一致時 | defaultなしで何もしない | UnhandledMatchError が発生 |
| PHP バージョン | すべて | PHP 8.0以降 |
switch文(break忘れのリスク)
<?php
$code = 200;
switch ($code) {
case 200: $msg = 'OK'; // breakなしでfall-throughの危険
case 404: $msg = 'Not Found'; break;
default: $msg = 'Unknown';
}
match式(安全・簡潔)
<?php
$code = 200;
$msg = match ($code) {
200 => 'OK',
404 => 'Not Found',
default => 'Unknown',
};
チェックポイント: match式は
defaultを書かない場合、どの値にも一致しないとUnhandledMatchErrorが投げられます。これは「想定外の値に気づける」という意味で安全な設計です。必ずdefaultを書くか、想定外の値を事前に除外してから使いましょう。
複数の値を一つのケースにまとめることも可能
<?php
$status = 301;
$type = match ($status) {
200, 201 => '成功',
301, 302 => 'リダイレクト',
404 => '未発見',
default => 'その他',
};
echo $type; // リダイレクト
まとめ & 次のステップ
- match式はPHP 8以降で使える、switchの安全な進化版
===の厳密比較なので型の違いによる誤判定が起きない- 戻り値として使えるため、変数への代入がシンプルに書ける
- breakが不要で、fall-throughは発生しない
defaultなしで未一致の場合はUnhandledMatchErrorが発生する
次回は while文を学びます。「条件が真の間くり返す」基本的なループ構文を身につけましょう。