php切换奇怪的异常

时间:2011-11-05 22:40:33

标签: php switch-statement

我有这个代码,其中$ difference = 0

switch ($difference) 
{
case 0<=$difference && $difference<300:
         return "A";
    break;
case 300<=$difference && $difference<600:
        return "B";
    break;  
}

我认为开关必须返回A但它会重新开始B.什么错了???

3 个答案:

答案 0 :(得分:1)

使用您正在使用的表达式的开关将不会像您想象的那样进行评估。请改用if语句:

if(0<=$difference && $difference<300)
{
    return "A";
}
else if(300<=$difference && $difference<600)
{
    return "B";
}

答案 1 :(得分:1)

我发布此信息仅仅是为了提供信息。

开关可以与表达式一起使用,但这很难做到:

<?php
$value = 300;
$other = 1;

switch (true) {
    case $value <= 300 && $other:
        $var = 'A';
        break;

    case $value >= 300 && !$other:
        $var = 'B';
        break;

    case $value >= 300 && $other:
        $var = 'C';
        break;

    case $value > 300 && $other:
        $var = 'D';
        break;

    default:
        $var = 'FALSE';
        break;
}

echo $var;

以上代码将正确显示“C”。 if / else语句的组合是等价的,但我倾向于发现交换机更具可读性。请务必始终包含一个默认大小写,其值可以依赖(或者可以从函数返回,抛出异常等)。

您还可以比较其他变量,类型,调用函数(尽管不推荐)等,以匹配switch语句中声明的值(在本例中为true,但可以是整数,字符串或任何其他基础类型)。

答案 2 :(得分:0)

在这种情况下,$difference等于0的情况被解释为false。因此你有switch(false)。每个案例都作为一个整体进行评估,案例2实际上返回false,从而匹配switch语句评估并返回B。它还与松散类型检查有关。 PHP.net