转换惊喜

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";
}