基礎

PHPのswitch文入門|複数条件の分岐をスッキリ書く方法

PHPのswitch文は、一つの変数の値に応じて複数の処理を分岐させる制御構造です。if...elseifを何度も繰り返すような場合、switch文を使うとコードがスッキリと読みやすくなります。

この記事では、switch文の基本構文から、break文の重要性、default節の使い方、実践的な活用パターンまで詳しく解説します。

基本的な使い方

switch文は、式の値と各caseの値を比較し、一致したcaseの処理を実行します。

PHP
<?php
$fruit = "りんご";

switch ($fruit) {
    case "りんご":
        echo "赤い果物です。\n";
        break;
    case "バナナ":
        echo "黄色い果物です。\n";
        break;
    case "ぶどう":
        echo "紫の果物です。\n";
        break;
    default:
        echo "不明な果物です。\n";
        break;
}
?>
実行結果
赤い果物です。

switch文では、まずswitch()の括弧内の式が評価されます。次に、上から順に各caseの値と比較され、一致した箇所から処理が実行されます。defaultはどのcaseにも一致しなかった場合に実行される処理です。

breakの重要性

switch文で最も重要なのがbreak文です。breakを書き忘れると、一致したcaseの処理だけでなく、それ以降のcaseの処理も連続して実行されてしまいます(フォールスルー)。

PHP
<?php
$num = 1;

echo "breakなし:\n";
switch ($num) {
    case 1:
        echo "1です\n";
    case 2:
        echo "2です\n";
    case 3:
        echo "3です\n";
}

echo "\nbreakあり:\n";
switch ($num) {
    case 1:
        echo "1です\n";
        break;
    case 2:
        echo "2です\n";
        break;
    case 3:
        echo "3です\n";
        break;
}
?>
実行結果
breakなし:
1です
2です
3です

breakあり:
1です
breakの書き忘れに注意

switch文のバグで最も多いのがbreakの書き忘れです。各caseの処理の最後に必ずbreakを記述しましょう。意図的にフォールスルーさせる場合は、コメントでその旨を明記するのがベストプラクティスです。

複数のcaseをまとめる

フォールスルーを意図的に利用して、複数のcaseで同じ処理を実行することもできます。

PHP
<?php
$month = 3;

switch ($month) {
    case 3:
    case 4:
    case 5:
        echo "春です。\n";
        break;
    case 6:
    case 7:
    case 8:
        echo "夏です。\n";
        break;
    case 9:
    case 10:
    case 11:
        echo "秋です。\n";
        break;
    case 12:
    case 1:
    case 2:
        echo "冬です。\n";
        break;
    default:
        echo "正しい月を入力してください。\n";
        break;
}
?>
実行結果
春です。

この書き方では、case 3、case 4、case 5のいずれかに一致した場合、同じ「春です。」が出力されます。breakを書かないことでフォールスルーさせ、同じ処理を共有しています。

実践的な使用例

PHP
<?php
$statusCode = 404;

switch ($statusCode) {
    case 200:
        $message = "OK - 正常に処理されました";
        break;
    case 301:
        $message = "Moved Permanently - リダイレクトします";
        break;
    case 403:
        $message = "Forbidden - アクセスが禁止されています";
        break;
    case 404:
        $message = "Not Found - ページが見つかりません";
        break;
    case 500:
        $message = "Internal Server Error - サーバーエラーです";
        break;
    default:
        $message = "不明なステータスコード: $statusCode";
        break;
}

echo "ステータス $statusCode: $message\n";
?>
実行結果
ステータス 404: Not Found - ページが見つかりません
switchは緩い比較(==)を使う

switch文の比較は == (緩い比較)で行われます。型の違いは無視されるため、case 0: は文字列 "abc" にもマッチしてしまいます。厳密な比較が必要な場合は、if...elseif文を使うか、PHP 8.0以降の match式を検討しましょう。

まとめ

  • switch文は一つの値に対して複数のcaseで分岐する制御構造
  • 各caseの末尾にはbreakを書かないとフォールスルーが発生する
  • defaultはどのcaseにも一致しない場合の処理を定義する
  • breakを省略して複数のcaseで同じ処理を共有できる
  • switch文は緩い比較(==)を使うため、型の一致には注意が必要