有人可以解释一下为什么在下面的代码中永远不会达到“a”的情况以及为什么它总是会执行案例0
switch ("a") {
case 0:
echo "0";
break;
case "a": // never reached because "a" is already matched with 0
echo "a";
break;
}
答案 0 :(得分:4)
PHP,就像JavaScript或Perl一样,是一种松散类型的语言,会尝试猜测你想做什么。在这种情况下,它将您的字符串更改为它可以找到的最接近的整数,即零。换句话说,"a" == 0
是PHP中的真实语句。
有关此主题的更多信息,请参阅PHP documentation。我建议您对switch
语句中的值进行类型转换,或将其替换为if
/ elseif
/ else
结构。
答案 1 :(得分:2)
你不能在switch语句中使用mix-cases,因为PHP会解释你的意思。
通俗地说,它会试图找到" a"''它没有定义到处理器,因此在这种情况下为0。
同样适用于以下代码:
<?php
$x = "a";
switch($x)
{
case "c":
echo "c";
break;
case 1:
echo "1";
break;
case 0:
echo "0";
break;
case "a":
echo "a";
break;
case false:
echo "false";
break;
default:
echo "def";
break;
}
?>
答案 2 :(得分:2)
原因是switch
使用了loose comparison ==
那说:
if ("a" == 0) // TRUE
if ("a" == true) // TRUE
几乎任何其他东西都会评估为假。 ("a" == "a"
除外)
因此,如果你需要比较字符串和整数,你应该只是转换为字符串进行比较。
//$var = "a";
$var = 0;
$var = strval($var);
switch ($var) {
case '0':
echo "0";
break;
case 'a':
echo "a";
break;
}
答案 3 :(得分:1)
case()上使用的变量类型应与switch()中使用的类型相同。
<?php
switch ("a") {
case "0":
echo "0";
break;
case "a": // never reached because "a" is already matched with 0
echo "a";
break;
}
对于整数类型:
<?php
switch (1) {
case 0:
echo 0;
break;
case 1: // never reached because "a" is already matched with 0
echo 1;
break;
}