轉換驚喜
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";
}