PHP Switch 意外

示例

Switch语句使用非严格比较来确定匹配项。这会导致一些令人讨厌的意外。例如,考虑以下语句:

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

这是一个非常简单的语句,当$name是字符串时,可以按预期工作,但否则会引起问题。例如,如果$name为integer 0,则在比较期间会发生类型冲突。但是,要弄混的是case语句中的文字值,而不是switch语句中的条件。该字符串"input 1"将转换为与integer0的输入值匹配的integer 0。这样做的结果是,如果您提供一个integer值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";
}