第12回: match式 — switch文の「安全な進化版」を使いこなす

章: 第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文を学びます。「条件が真の間くり返す」基本的なループ構文を身につけましょう。

Related Articles