PHP切换和if语句输出不同的结果

时间:2013-12-19 13:16:00

标签: php conditional-statements

有人可以解释一下这里发生了什么吗? 这是代码:

$num = 0;

switch($num){

case ($num==0):
    echo $num ,  " is ZERO";
    break;

case ($num>0):
    echo $num ,  " is POSITIVE";
    break;

default:echo $num , " is NEGATIVE";
}

以上输出0为POSITIVE

if($num==0){

print ($num." is ZERO");

} 

elseif($num>0){

echo $num ,  " is POSITIVE";

}

else{

echo $num , " is NEGATIVE";

}

这按预期工作 - 0是零。 如果我更换   case($ num == 0)with case(0)输出正常。

为什么案例($ num == 0)失败? 有人告诉我在case语句中评估多个表达式的问题,但它在语法上似乎很好。

2 个答案:

答案 0 :(得分:1)

switchswitch (...)表达式中的所有内容与每种情况进行比较:

switch ($num) {
    case 0 :
        ...
    case 1 :
        ...
    ...
}

您不会写case $num == 0,因为它等同于if ($num == 0 == $num)

如果有的话,你必须这样做:

switch (true) {
    case $num == 0 :
        ...
    case $num > 0 :
        ...
    ...
}

但也有人对此不以为然。

答案 1 :(得分:1)

switch运算符的逻辑结构如下:

switch($x):
case val1:
    action 1;
    break;

case val2:
    action 2;
    break;

default:
    not val1 and val2;

switch将$ x与其中一个值进行比较,或者在没有匹配的情况下给出default分支。所以,你不能写:

case ($num > 0):

case ($num == 0 ):

在你的情况下它给出了POSITIVE,因为php首先评估case中的表达式,并且我们在输出中得到以下内容:

Is $num == 0 ?: yes => 1
Is $num > 0 ?: no => 0

真正的开关php评估是这样的:

$num = 0;

switch($num){

case 1:
    echo $num ,  " is ZERO";
    break;

case 0:
    echo $num ,  " is POSITIVE";
    break;

default:
    echo $num , " is NEGATIVE";
}

输出为:积极。