switch (表達式) {
case 值1:
// 程式碼
break;
case 值2:
// 程式碼
break;
default:
// 預設程式碼
}
PHP 的 switch 採用 鬆散比較(==),而非嚴格比較(===)。這意味著 1 == "1"、1 == true、0 == false == null == "" 皆為 true。開發時務必注意此行為,避免邏輯錯誤。
<?php
$score = 85;
switch ($score) {
case $score >= 90 && $score <= 100: echo "優"; break;
case $score >= 80 && $score < 90: echo "良"; break;
case $score >= 70 && $score < 80: echo "中"; break;
case $score >= 60 && $score < 70: echo "及格"; break;
case $score >= 0 && $score < 60: echo "不及格"; break;
default: echo "成績輸入錯誤";
}
?>
此寫法利用 case 後接布林表達式,實現區間判斷,比連續 if-elseif 更清晰。
| 情境 | 代碼片段 | 輸出 | 說明 |
|---|---|---|---|
| 整數匹配字串 | $a=1; switch($a){ case "1": echo 'hit'; } | hit | 字串 "1" 轉為整數 1 |
| 字串匹配整數 | $a="1"; switch($a){ case 1: echo 'hit'; } | hit | 字串 "1" 轉為整數 1 |
| 浮點數精確匹配 | $a=1.1; switch($a){ case 1.1: echo 'hit'; } | hit | 浮點數直接比較 |
| 布林 true 匹配 1 | $a=true; switch($a){ case 1: echo 'hit'; } | hit | true == 1 |
| null 匹配 0/false/"" | $a=null; switch($a){ case 0: echo 'hit'; } | hit | null == 0 == false == "" |
break 位置$a = 5;
switch ($a) {
case 5: echo "我是5號出口"; // 缺少 break
case true: echo "hello"; // 會繼續執行
}
// 輸出:我是5號出口hello
若刻意需要穿透,建議加註釋 // no break 提醒維護者。
default 位置不影響邏輯$a = 50;
switch ($a) {
default: echo "default先執行"; // 缺少 break
case 50: echo "case 50"; // 仍會執行
}
// 輸出:default先執行case 50
default 只是另一個 case,位置可置頂、置中或置底,關鍵在於是否有 break。
match (PHP 8.0+) 或 if ($a === $b)。match 搭配區間運算子。(int)$_GET['id']。case 結尾務必加 break 或 return。理解 switch 的鬆散比較機制,能避免 90% 的邏輯 Bug。配合 PHP 8 的 match 表達式,現代代碼更應優先採用嚴格比較,讓意圖更明確、除錯更容易。