概要
ある変数の値によって 5 通り 10 通りと多くの分岐をしたい場面、if / elseif / elseif / ... をひたすら並べると縦に長くなって読みにくい。これを「ある値を、各候補と等しいか順に照合する」と意図を絞った形で書けるのが switch 文だ。曜日番号 1〜7 を曜日名に変換する、コマンド文字列でハンドラを振り分ける、ステータスコード別にメッセージを出す — こういう「1 つの値に対する多分岐」で読みやすさが大きく違う。
PHP の switch で 絶対に外せない約束 が、各 case の最後に break を書くこと。PHP は C 言語と同じく フォールスルー仕様 で、break がないと一致した case から下の case の中身まで連続実行してしまう。これは意図的に複数 case で同じ処理を共有したい時に使えるが、書き忘れによる連続実行は超頻出バグ なので、毎回 break を書く癖を体に刷り込む。どの case にも当たらなかったときに通る default も合わせて覚えておく。
PHP 8 からは switch の代替として match 式 が追加された。match は (1) 緩い比較 == ではなく 厳密比較 === を使う、(2) break 不要 (フォールスルーしない)、(3) 式なので値を返せる という違いがあり、ほとんどの場面で match の方が安全で読みやすい。とはいえ既存コードや古い PHP では switch が現役なので、まずは switch の挙動を正しく理解しておくのが本章の目的。
学習目標
- 値の多分岐を
switchで書ける - 各
caseの最後にbreakが必要だと理解する - どの値にも一致しなかった場合は
defaultで受ける
ドリル
| no | 内容 |
|---|---|
| 01 | 数字 1-7 を曜日名に変換 |
| 02 | grade (A/B/C/D) を合格/不合格に振り分け |
📝 演習: ドリル 01 — 数字を曜日名に変換
問題
標準入力で 1〜7 の整数を 1 行受け取り、
対応する曜日名を出力してください。1-7 以外なら unknown を出力します。
| 入力 | 出力 |
|---|---|
| 1 | Mon |
| 2 | Tue |
| 3 | Wed |
| 4 | Thu |
| 5 | Fri |
| 6 | Sat |
| 7 | Sun |
| その他 | unknown |
判定には switch 文を使うこと。
入力例:
3
期待される出力:
Wedヒント
$n = (int) trim(fgets(STDIN));で整数として読むswitch ($n) { case 1: ... break; ... default: ... }- 各 case の最後に
break;を忘れない
📝 演習: ドリル 02 — grade を合格/不合格に振り分け
問題
標準入力で grade を 1 行受け取ります。値は A B C D のいずれかです。
C 以上 (= A / B / C) なら pass、D なら fail を出力してください。
判定には switch 文を使うこと。
ヒント: A と B と C で同じ処理にしたい場合は、case "A": と case "B": を続けて書いて break を省略する書き方が使えます。
| 入力 | 出力 |
|---|---|
| A | pass |
| B | pass |
| C | pass |
| D | fail |
入力例:
B
期待される出力:
passヒント
$grade = trim(fgets(STDIN));で文字列として読む- 複数 case を 1 つの処理にまとめる:
case "A": case "B": case "C": echo "pass\n"; break;