ch05 6章中 5章目

ch05 — switch 文

スライドで見る

この章を AI と学ぶ

💬 AI に聞く質問例 3 件
  1. 「ch05 — switch 文」のつまずきやすいポイントを、初学者向けに3つ教えてください

    ChatGPT Claude Gemini

  2. 「ch05 — switch 文」について、自分の手で試せる練習問題を3つ出してください (難易度を上げながら)

    ChatGPT Claude Gemini

  3. 「ch05 — switch 文」を学んだ後、次に学ぶと良いトピックは何ですか?理由も教えてください

    ChatGPT Claude Gemini

概要

ある変数の値によって 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) を合格/不合格に振り分け

解説スライド 全 7 枚

右の ボタン キー(またはスワイプ)で次のスライドに進めます。 下の「縦表示」を開くと全スライドを一気に読めます。

  1. switch 文

    Lesson 2 / Chapter 5

  2. if/elseif が長くなると読みにくい

    <?php
    if ($n === 1) {
        echo "Mon\n";
    } elseif ($n === 2) {
        echo "Tue\n";
    } elseif ($n === 3) {
        echo "Wed\n";
    } elseif ($n === 4) {
        echo "Thu\n";
    }

    1 つの値」を「たくさんの候補」と比較する形は、 switch で書くと見通しが良くなる。

  3. switch の基本形

    <?php
    switch ($n) {
        case 1:
            echo "Mon\n";
            break;
        case 2:
            echo "Tue\n";
            break;
        default:
            echo "unknown\n";
            break;
    }
    • switch ($n)判定したい値 を渡す
    • case 1: は「$n が 1 のとき」
    • default: は「どの case にも当たらないとき」
  4. break を忘れると 次の case まで流れる

    <?php
    switch ($n) {
        case 1:
            echo "Mon\n";
            // break を書き忘れた!
        case 2:
            echo "Tue\n";
            break;
    }

    $n = 1 のとき、出力は:

    Mon
    Tue
    • break がないと 次の case も実行される (フォールスルー)
    • これは 初学者の典型バグ
    • case の最後には 必ず break; を書く
  5. default で「それ以外」を受ける

    <?php
    switch ($grade) {
        case "A":
            echo "Excellent\n";
            break;
        case "B":
            echo "Good\n";
            break;
        default:
            echo "Other\n";
            break;
    }
    • default は省略してもよい
    • 省略するとどの case にも当たらない場合 何も実行されない
    • 「想定外を検出したい」なら default を書く
  6. switch を使うべきかどうか

    判定したいこと 推奨
    1 つの値が「特定の候補のどれか」 switch
    範囲チェック ($n >= 0 && $n <= 100) if
    複雑な複合条件 ($a > 0 && $b < 10) if

    switch「値の一致」専用 と覚える。

  7. このチャプターでできるようになること

    switch で値の多分岐を書ける ✅ 各 case の最後に break を付けられる ✅ default で「それ以外」を受けられる ✅ break 忘れによるフォールスルー事故を防げる

    → ドリルへ

1 / 7
📜 スライドを全部一気に読む(縦表示)

Lesson 2 / Chapter 5


if/elseif が長くなると読みにくい

<?php
if ($n === 1) {
    echo "Mon\n";
} elseif ($n === 2) {
    echo "Tue\n";
} elseif ($n === 3) {
    echo "Wed\n";
} elseif ($n === 4) {
    echo "Thu\n";
}

1 つの値」を「たくさんの候補」と比較する形は、 switch で書くと見通しが良くなる。


switch の基本形

<?php
switch ($n) {
    case 1:
        echo "Mon\n";
        break;
    case 2:
        echo "Tue\n";
        break;
    default:
        echo "unknown\n";
        break;
}
  • switch ($n)判定したい値 を渡す
  • case 1: は「$n が 1 のとき」
  • default: は「どの case にも当たらないとき」

break を忘れると 次の case まで流れる

<?php
switch ($n) {
    case 1:
        echo "Mon\n";
        // break を書き忘れた!
    case 2:
        echo "Tue\n";
        break;
}

$n = 1 のとき、出力は:

Mon
Tue
  • break がないと 次の case も実行される (フォールスルー)
  • これは 初学者の典型バグ
  • case の最後には 必ず break; を書く

default で「それ以外」を受ける

<?php
switch ($grade) {
    case "A":
        echo "Excellent\n";
        break;
    case "B":
        echo "Good\n";
        break;
    default:
        echo "Other\n";
        break;
}
  • default は省略してもよい
  • 省略するとどの case にも当たらない場合 何も実行されない
  • 「想定外を検出したい」なら default を書く

switch を使うべきかどうか

判定したいこと 推奨
1 つの値が「特定の候補のどれか」 switch
範囲チェック ($n >= 0 && $n <= 100) if
複雑な複合条件 ($a > 0 && $b < 10) if

switch「値の一致」専用 と覚える。


このチャプターでできるようになること

switch で値の多分岐を書ける ✅ 各 case の最後に break を付けられる ✅ default で「それ以外」を受けられる ✅ break 忘れによるフォールスルー事故を防げる

→ ドリルへ

この章で取り組む 演習問題の流れ (2ステップ)
  1. 01 ドリル 01 — 数字を曜日名に変換 README.md starter.php answer.php
  2. 02 ドリル 02 — grade を合格/不合格に振り分け README.md starter.php answer.php

演習問題の詳細

この章の演習問題の内容を読めます。実際に手元で解くには教材リポジトリを clone してください。

ドリル 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; を忘れない

🧪 ブラウザで試す

スライドのコードを写経して ▶ 実行、自分で書いて 📝 採点 で答え合わせ。初回のみ PHP ランタイム読込で数秒かかります。

PHP ランタイム未読込

          

        

ドリル 02 — grade を合格/不合格に振り分け

問題

標準入力で grade を 1 行受け取ります。値は A B C D のいずれかです。 C 以上 (= A / B / C) なら passD なら fail を出力してください。

判定には switch 文を使うこと。 ヒント: ABC で同じ処理にしたい場合は、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;

🧪 ブラウザで試す

スライドのコードを写経して ▶ 実行、自分で書いて 📝 採点 で答え合わせ。初回のみ PHP ランタイム読込で数秒かかります。

PHP ランタイム未読込

          

        

演習問題(2問)

  1. ドリル 01 — 数字を曜日名に変換

    README.md starter.php answer.php

  2. ドリル 02 — grade を合格/不合格に振り分け

    README.md starter.php answer.php

サイト内で問題文・雛形・解答例を確認できます。実際に手元で解くには教材リポジトリを clone してください。

完了にすると進捗に反映されます