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语句中的值具有相同的类型。
使用if语句将使我们能够控制比较的完成方式,从而允许我们使用严格的比较运算符:
if ($name === "input 1") { $mode = "output_1"; } elseif ($name === "input 2") { $mode = "output_2"; } else { $mode = "unknown"; }