萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 網路程式設計 >> PHP 程式設計

PHP switch 語句用法詳解與字串比較 0 值陷阱

PHP switch 語法、優勢與經典坑:空字串等於 0

switch 可替代冗長的 if/elseif/else,結構清晰、效能略佳 (條件只求值一次)。但 PHP 的 switch 使用鬆散比較 (==),導致 '' == 0 為 true,易造成邏輯錯誤。

基本語法

<?php
switch ($expr) {
    case 'value1':
        // code...
        break;
    case 'value2':
        // code...
        break;
    default:
        // 無匹配時執行
}
?>
  • break 結束該 case,否則會「貫穿」執行下一個 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;
}
?>

⚠️ 經典陷阱:switch 使用 == 比較

<?php
var_dump('' == 0);   // true  (鬆散比較)
var_dump('' === 0);  // false (嚴格比較)

$errid = '';
switch ($errid) {
    case 0:
        echo 'xxx'; // 會執行!因為 '' == 0 為 true
        break;
    default:
        echo 'yyy';
}
// 輸出: xxx  (預期應為 yyy)
?>

解決方案

方案 1:先嚴格檢查型別

<?php
$errid = '';
if (!is_numeric($errid)) { // 或 is_string(), === '' 等
    echo '無效輸入';
    return;
}
switch ($errid) {
    case 0: echo '零'; break;
    default: echo '其他';
}
?>

方案 2:統一轉型為字串比較

<?php
$val = (string)$_GET['id']; // 強制字串
switch ($val) {
    case '0': echo '字串零'; break;
    case '':  echo '空字串'; break;
    default:  echo '其他';
}
?>

方案 3:PHP 8.0+ match 表達式 (嚴格比較 ===)

<?php
// PHP 8.0+
$result = match ($errid) {
    0 => '零',
    '' => '空字串',
    default => '其他',
};
echo $result;
// match 使用 === 比較,不會有 '' == 0 問題
?>

switch vs if/elseif 效能

  • switch:條件表達式**只求值一次**,再與各 case 比較。
  • if/elseif:每個條件**分別求值**。
  • 條件複雜或在迴圈中大量執行時,switch (或 PHP 8 match) 效能略優。

最佳實踐總結

  1. 優先使用 match (PHP 8+) 獲得嚴格比較與表達式回傳值。
  2. PHP < 8 時,先做型別/空值檢查 再進入 switch。
  3. 避免在 case 中混用數字與字串,統一型別。
  4. 善用 default 處理預期外數值。
  5. 記得 break,否則會貫穿 (除非刻意設計)。
copyright © 萬盛學電腦網 all rights reserved