PHPのswitch文は、一つの変数の値に応じて複数の処理を分岐させる制御構造です。if...elseifを何度も繰り返すような場合、switch文を使うとコードがスッキリと読みやすくなります。
この記事では、switch文の基本構文から、break文の重要性、default節の使い方、実践的な活用パターンまで詳しく解説します。
基本的な使い方
switch文は、式の値と各caseの値を比較し、一致したcaseの処理を実行します。
<?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
$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です
switch文のバグで最も多いのがbreakの書き忘れです。各caseの処理の最後に必ずbreakを記述しましょう。意図的にフォールスルーさせる場合は、コメントでその旨を明記するのがベストプラクティスです。
複数のcaseをまとめる
フォールスルーを意図的に利用して、複数のcaseで同じ処理を実行することもできます。
<?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
$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文の比較は == (緩い比較)で行われます。型の違いは無視されるため、case 0: は文字列 "abc" にもマッチしてしまいます。厳密な比較が必要な場合は、if...elseif文を使うか、PHP 8.0以降の match式を検討しましょう。
まとめ
- switch文は一つの値に対して複数のcaseで分岐する制御構造
- 各caseの末尾にはbreakを書かないとフォールスルーが発生する
- defaultはどのcaseにも一致しない場合の処理を定義する
- breakを省略して複数のcaseで同じ処理を共有できる
- switch文は緩い比較(==)を使うため、型の一致には注意が必要