请解释为什么PHP switch case始终在此代码中执行case 0

时间:2017-01-12 03:36:05

标签: php switch-statement

有人可以解释一下为什么在下面的代码中永远不会达到“a”的情况以及为什么它总是会执行案例0

switch ("a") {
case 0:
    echo "0";
    break;
case "a": // never reached because "a" is already matched with 0
    echo "a";
    break;
}

4 个答案:

答案 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;
}

?>

Documentation is available at PHP.net

答案 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;
}