转换惊喜
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";
}