switch 是 PHP 中處理多條件分支的核心結構,但許多開發者僅停留在基礎用法。本文深入解析其執行機制、break 省略技巧、default 陷阱、型別比較行為,並展示實戰中「利用 fall-through 實現倍數累乘」的經典模式。
switch ($expr) {
case value1:
// code
break;
case value2:
// code
break;
default:
// code
}
case 支援整數、浮點數、字串;不支援陣列/物件(除非解引用為標量)。"1" == 1 為 true。continue 在 switch 中等同於 break;若在循環中需跳到外層循環,用 continue 2。PHP switch 逐行執行,只有匹配到 case 才開始執行,直到遇到 break、return 或 switch 結束。若省略 break,會繼續執行下一個 case 的代碼(fall-through)。
$i = 0;
switch ($i) {
case 0: echo "0"; // 執行
case 1: echo "1"; // 繼續執行(無 break)
case 2: echo "2"; // 繼續執行
}
// 輸出:012
switch ($i) {
case 0:
case 1:
case 2:
echo "i < 3 且非負數";
break;
case 3:
echo "i == 3";
}
PHP 官方文檔範例:將 400M、2G 等字串轉為位元組數。
function return_bytes(string $val): int {
$val = trim($val);
$last = strtolower($val[strlen($val) - 1]); // 取最後一字元
switch ($last) {
case 'g': $val *= 1024; // 故意不 break
case 'm': $val *= 1024; // 故意不 break
case 'k': $val *= 1024; // 故意不 break
}
return (int)$val;
}
// 測試
ini_set('memory_limit', '400M');
echo return_bytes(ini_get('memory_limit')); // 419430400 (400 * 1024 * 1024)
400M → 匹配 case 'm' → 執行 $val *= 1024(變 400K)→ fall-through 到 case 'k' → 再執行 $val *= 1024(變 400B)→ 結束。2G → 依次經過 g、m、k 三次 *= 1024,正好換算到位元組。註:此技巧極度依賴 case 順序(G → M → K),維護時務必添加註解,否則極易被誤加 break 導致邏輯錯誤。
switch 僅支援鬆散比較。需嚴格比較(===)時,改用 match(PHP 8.0+)或 if/elseif。
// PHP 8.0+ match 表達式:嚴格比較、無 fall-through、支援回傳值
$result = match ($status) {
200, 201 => 'success',
404 => 'not found',
default => 'unknown',
};
elseif 鏈每次都重新求值。default 不必寫在最後,但建議置末尾以提高可讀性。case 可為空,單純用於 fall-through 合併條件。// no break。match 表達式,語意更清晰、安全。switch 的 fall-through 機制是雙刃劍:理解它能寫出極簡的單位換算函數,誤用它會產生難以排查的 Bug。養成「預設加 break、例外加註解」的習慣,並拥抱 PHP 8 的 match 迎接更現代的分支寫法。