2017-01-12 34 views
5

有人能请解释原因的情况下“一”是永远不会下面的代码达到,为什么它会一直执行的情况下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

开关不能在字符串和数字在同时使用[阅读全文](http://php.net/manual/en/control-structures.switch.php#82351) – happymacarts

+0

只是一个猜测,但某些开关值是整数,有些是串的事实可能会导致问题。 – John3136

回答

3

PHP,如JavaScript或Perl,是一种松散类型的语言,并会尝试猜你想要做什么。在这种情况下,它将字符串更改为可找到的最接近的整数,即零。换句话说,"a" == 0在PHP中是一个真实的声明。

有关此主题的更多信息,请参见PHP 。我建议你在switch声明中声明值,或用if/elseif/else结构替换它。

+1

我链接了错误的例子... https://3v4l.org/tC3pt。从我可以告诉的情况来看,这不是那么可预测的。 –

+0

有趣的是,它似乎有时候是'select'中的值,它有时会变成'case'中的值。 – miken32

+0

是的,这很奇怪。尝试使'$ x =“0”的值;'......我可以看到它是错误的,但同时它是一个“0”的字面值,并且仍然支持“真实”情况。我认为这可能与某些方面的排序有关,但我不能确定。 –

2

你可以在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; 
} 

?> 

Documentation is available at PHP.net

1

上情况下使用的可变型()应该是在开关中使用相同类型的()。

<?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; 
} 
1

这样做的原因是因为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; 
}