switch 是多條件分支的結構化寫法,避免冗長的 if-elseif-else 鏈。本文涵蓋語法、執行機制、類型比較陷阱、實戰模式與現代替代方案。
<?php
switch ($action) {
case 'add':
echo '新增';
break;
case 'edit':
case 'update': // 多 case 共用邏輯
echo '編輯';
break;
case 'delete':
echo '刪除';
break;
default:
echo '未知操作';
}
執行流程:計算表達式 → 依序比較 case 值(鬆散比較 ==) → 匹配則執行直到 break 或結束 → 無匹配執行 default。
$x = '0';
switch ($x) {
case 0: echo '匹配整數 0'; break; // 執行此分支!'0' == 0 為 true
case '0': echo '匹配字符串 0'; break;
default: echo '其他';
}
// 輸出:匹配整數 0
對策:
(string)$x)。match 表達式(嚴格比較 ===,見下文)。<?php // router.php
$action = $_GET['action'] ?? 'home';
switch ($action) {
case 'login': require 'controllers/login.php'; break;
case 'register': require 'controllers/register.php'; break;
case 'dashboard': require 'controllers/dashboard.php'; break;
default: http_response_code(404); require 'views/404.php';
}
$result = match ($status) {
200, 201 => 'Success',
400 => 'Bad Request',
401 => 'Unauthorized',
404 => 'Not Found',
500 => 'Server Error',
default => 'Unknown',
};
// 優勢:嚴格比較 ===、無 break 落入、返回值、單行簡潔
switch 內部優化為跳轉表,case 多時比 if-elseif 快。if-else 可讀性更高。match 或陣列映射 [$action => $handler]。switch 是結構化分支的經典工具,但需警惕 == 型別轉換陷阱。PHP 8+ 專案優先使用 match 表達式,獲得嚴格比較、函數式風格與更佳效能。