轉換驚喜

Switch 語句使用非嚴格比較來確定匹配。這可能會導致一些令人討厭的驚喜 。例如,請考慮以下語句:

switch ($name) {
    case 'input 1':
        $mode = 'output_1';
        break;
    case 'input 2':
        $mode = 'output_2';
        break;
    default:
        $mode = 'unknown';
        break;
}

這是一個非常簡單的語句,當 $name 是一個字串時,它會按預期工作,否則會導致問題。例如,如果 $name 是整數 0,則在比較期間將發生型別雜耍。但是,它是 case 語句中的字面值,而不是 switch 語句中的條件。字串 input 1 轉換為整數 0,它匹配整數 0 的輸入值。這樣做的結果是如果你提供一個整數 0 的值,第一種情況總是執行。

這個問題有幾個解決方案:

顯式轉換

在比較之前,可以將值強制轉換為字串:

switch ((string)$name) {
...
}

或者也可以使用已知返回字串的函式:

switch (strval($name)) {
...
}

這兩種方法都確保該值與 case 語句中的值具有相同的型別。

避免 switch

使用 if 語句將控制我們如何進行比較,允許我們使用嚴格的比較運算子

if ($name === "input 1") {
    $mode = "output_1";
} elseif ($name === "input 2") {
    $mode = "output_2";
} else {
    $mode = "unknown";
}