PHP switch文をcaseとdefaultで分岐する方法
PHP の switch 文は、1つの式を複数の case 値と比較し、最初に一致した分岐を実行します。変数が取り得る値が限られていて、値ごとに処理を切り替える場面で使います。複数の case ラベル(PHP の case 文)を1つの分岐にまとめると、長い if/elseif チェーンで重複した条件を書く必要がなくなります。
値一致で分岐する PHP switch 文の例
出力:
ここに出力が表示されます...
出力:
リソースを書き込み
この例の仕組み
switch ($method)は$methodを1回評価し、その結果を各caseの値と緩やかな比較(==)で照合します。case "GET"は"POST"に一致しないため、次の case へ進みます。case "POST"が一致します。このラベルの直後にbreakがないため、実行はcase "PUT"のブロックへフォールスルーします。これにより、両方のメソッドを同じ分岐にまとめられます。breakは出力後に switch から抜けます。これがないと、実行はdefaultまで進みます。defaultはどの case にも一致しないときの受け皿です。省略できますが、防御的なコードでは推奨されます。
PHP の switch は厳密比較と緩やかな比較のどちらを使う?
PHP の switch は緩やかな比較(==)を使うため、照合時に値が型変換されることがあります。典型的な落とし穴は、"0" が case 0 に一致し、false も case 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 式の違い
| switch | match (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 が適しています。