PHP switch文をcaseとdefaultで分岐する方法

PHP の switch 文は、1つの式を複数の case 値と比較し、最初に一致した分岐を実行します。変数が取り得る値が限られていて、値ごとに処理を切り替える場面で使います。複数の case ラベル(PHP の case 文)を1つの分岐にまとめると、長い if/elseif チェーンで重複した条件を書く必要がなくなります。

値一致で分岐する PHP switch 文の例

出力:

ここに出力が表示されます...

出力:

リソースを書き込み

この例の仕組み

  1. switch ($method)$method を1回評価し、その結果を各 case の値と緩やかな比較(==)で照合します。
  2. case "GET""POST" に一致しないため、次の case へ進みます。
  3. case "POST" が一致します。このラベルの直後に break がないため、実行は case "PUT" のブロックへフォールスルーします。これにより、両方のメソッドを同じ分岐にまとめられます。
  4. break は出力後に switch から抜けます。これがないと、実行は default まで進みます。
  5. default はどの case にも一致しないときの受け皿です。省略できますが、防御的なコードでは推奨されます。

PHP の switch は厳密比較と緩やかな比較のどちらを使う?

PHP の switch は緩やかな比較(==)を使うため、照合時に値が型変換されることがあります。典型的な落とし穴は、"0"case 0 に一致し、falsecase 0 に一致する点です。case の順序は重要で、最初に緩やかに一致したものが採用されます。厳密比較が必要なら match(PHP 8+)か、=== を使う明示的な if/elseif を使ってください。

PHP switch でよくある間違い

break がない(意図しないフォールスルー):

悪い例:

$role = "admin";
switch ($role) {
    case "admin":
        $label = "admin";
    case "editor":
        $label = "editor";
        break;
}

正しい例:

$role = "admin";
switch ($role) {
    case "admin":
        $label = "admin";
        break;
    case "editor":
        $label = "editor";
        break;
}

break がないと、一致した case の後も続く分岐が実行されます。意図的にフォールスルーさせる場合は、ラベルをコードなしで連続させてグループ化します。

ループ内で continue を使い、次の反復へ進むと思い込む:

悪い例:

$items = ["処理", "スキップ", "処理"];

foreach ($items as $item) {
    switch ($item) {
        case "スキップ":
            continue; // ループではなく switch を抜ける
    }

    echo $item . "\\n";
}

正しい例:

$items = ["処理", "スキップ", "処理"];

foreach ($items as $item) {
    switch ($item) {
        case "スキップ":
            continue 2; // foreach の次の反復へ進む
    }

    echo $item . "\\n";
}

ループにネストされた switch の中では、continue は switch に対する break と同様に振る舞います。外側のループを進めるには continue 2 を使います。

PHP switch と match 式の違い

switchmatch (PHP 8+)
文であり値を返さない式であり値を返す
緩やかな比較 (==)厳密比較 (===)
デフォルトでフォールスルーするフォールスルーせず、各アームが値を返す
各 case で複数行のブロックを扱える各アームは1つの式

分岐内で複数の文を実行する場合や、意図的なフォールスルーで case をまとめる場合は switch を使います。値を厳密比較で結果にマッピングする用途なら match が適しています。

FAQ

PHP switch文で break はなぜ必要?

PHP の switch はデフォルトでフォールスルーするため、1つの case が一致すると break か switch ブロックの終端に到達するまで後続の分岐も実行されます。break 文は switch を即座に終了します。省略してよいのは、同じロジックを共有する case を意図的にグループ化するときだけです。

PHP 8+ では switch ではなく match を使うべき場面は?

厳密比較が必要なとき、結果を変数に代入したいとき、または各分岐が1つの式で表現できるときは match を優先してください。分岐内で複数の文や副作用を扱う場合、または意図的なフォールスルーが必要な場合は switch が適しています。