有人能请解释原因的情况下“一”是永远不会下面的代码达到,为什么它会一直执行的情况下0请解释为什么PHP开关的情况下总是处于代码执行的情况下,0
switch ("a") {
case 0:
echo "0";
break;
case "a": // never reached because "a" is already matched with 0
echo "a";
break;
}
有人能请解释原因的情况下“一”是永远不会下面的代码达到,为什么它会一直执行的情况下0请解释为什么PHP开关的情况下总是处于代码执行的情况下,0
switch ("a") {
case 0:
echo "0";
break;
case "a": // never reached because "a" is already matched with 0
echo "a";
break;
}
PHP,如JavaScript或Perl,是一种松散类型的语言,并会尝试猜你想要做什么。在这种情况下,它将字符串更改为可找到的最接近的整数,即零。换句话说,"a" == 0
在PHP中是一个真实的声明。
有关此主题的更多信息,请参见PHP 。我建议你在switch
声明中声明值,或用if
/elseif
/else
结构替换它。
我链接了错误的例子... https://3v4l.org/tC3pt。从我可以告诉的情况来看,这不是那么可预测的。 –
有趣的是,它似乎有时候是'select'中的值,它有时会变成'case'中的值。 – miken32
是的,这很奇怪。尝试使'$ x =“0”的值;'......我可以看到它是错误的,但同时它是一个“0”的字面值,并且仍然支持“真实”情况。我认为这可能与某些方面的排序有关,但我不能确定。 –
你可以在switch语句中没有使用混合用例,因为PHP会解释你的意思。通过外行人的说法,它会尝试找到未定义给处理器的''值',因此在这种情况下为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;
}
?>
上情况下使用的可变型()应该是在开关中使用相同类型的()。
<?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;
}
这样做的原因是因为switch
使用loose comparison==
这就是说:
if ("a" == 0) // TRUE
if ("a" == true) // TRUE
几乎任何人会评估为false。 ("a" == "a"
除外)
因此,如果您需要对字符串和整数进行比较,则应将其转换为字符串进行比较。
//$var = "a";
$var = 0;
$var = strval($var);
switch ($var) {
case '0':
echo "0";
break;
case 'a':
echo "a";
break;
}
开关不能在字符串和数字在同时使用[阅读全文](http://php.net/manual/en/control-structures.switch.php#82351) – happymacarts
只是一个猜测,但某些开关值是整数,有些是串的事实可能会导致问题。 – John3136