switch 可替代冗長的 if/elseif/else,結構清晰、效能略佳 (條件只求值一次)。但 PHP 的 switch 使用鬆散比較 (==),導致 '' == 0 為 true,易造成邏輯錯誤。
<?php
switch ($expr) {
case 'value1':
// code...
break;
case 'value2':
// code...
break;
default:
// 無匹配時執行
}
?>
break 結束該 case,否則會「貫穿」執行下一個 case。case 'a': case 'b':。<?php
$cps_sign = 'yiqifa';
switch ($cps_sign) {
case 'yiqifa':
case 'chengguo':
case 'roiyiqifa':
case 'lkt':
case 'fanli':
case 'qqfanli':
case 'weiyi':
case 'yoyi':
$sql = \"INSERT INTO sa_cps_list (uv, s_time, cps, url) VALUES ('{$uv}', {$timestamp}, '{$cps_sign}', '{$url}')\";
mysql_query($sql);
break;
default:
// 其他處理
break;
}
?>
<?php
var_dump('' == 0); // true (鬆散比較)
var_dump('' === 0); // false (嚴格比較)
$errid = '';
switch ($errid) {
case 0:
echo 'xxx'; // 會執行!因為 '' == 0 為 true
break;
default:
echo 'yyy';
}
// 輸出: xxx (預期應為 yyy)
?>
<?php
$errid = '';
if (!is_numeric($errid)) { // 或 is_string(), === '' 等
echo '無效輸入';
return;
}
switch ($errid) {
case 0: echo '零'; break;
default: echo '其他';
}
?>
<?php
$val = (string)$_GET['id']; // 強制字串
switch ($val) {
case '0': echo '字串零'; break;
case '': echo '空字串'; break;
default: echo '其他';
}
?>
<?php
// PHP 8.0+
$result = match ($errid) {
0 => '零',
'' => '空字串',
default => '其他',
};
echo $result;
// match 使用 === 比較,不會有 '' == 0 問題
?>
switch:條件表達式**只求值一次**,再與各 case 比較。if/elseif:每個條件**分別求值**。switch (或 PHP 8 match) 效能略優。match (PHP 8+) 獲得嚴格比較與表達式回傳值。switch。default 處理預期外數值。break,否則會貫穿 (除非刻意設計)。