PHP开关进入大小写0:即使存在有效的大小写


PHP switch entering case 0: even if there is a valid case?

下面的switch case语句应该执行case "january"的值:但它执行的是case 0的值:,有人能告诉我为什么这样做吗?代码:

<?php
$a = "january";
switch ($a)
{
    case 0:
    case 3:
        echo "The value is either 0 or 3";
        break;
        echo "0/2";
        break;
    case "january":
        echo "january";
        break;
    case "march":
        echo "The value is ";
        break;
    case 2:
        echo "The value is 2";
        break;
    default:
        echo "Here is ur default message";
        break;
}
?>

顺便说一下,它正在做同样的情况下"march"....?

$a = 'january';
var_dump($a == 0);
var_dump($a === 0);
var_dump($a == '0');
var_dump($a === '0');
输出:

bool(true)
bool(false)
bool(false)
bool(false)

阅读类型杂耍。显然,switch使用了松散的比较:

注意:
注意,switch/case做松散比较。

PHP有一些问题可以导致这种行为,在这种情况下,问题来自于您在Switch上使用不同类型的事实。

试试这个代码:

echo (0 == "january") ? "true'n" : "false'n"; // Echoes true
解决这个问题的一种方法是在交换机上只使用字符串,如下所示:
switch ($a)
{
    case "0":
    case "3":
        echo "The value is either 0 or 3";
        break;
        echo "0/2";
        break;
    case "january":
        echo "january";
        break;
    case "march":
        echo "The value is ";
        break;
    case "2":
        echo "The value is 2";
        break;
    default:
        echo "Here is ur default message";
        break;
}

这个可以正常工作,因为0 == "0"但是"january" != "0"

Switch使用简单的==将变量的值与每个case的值进行比较。

你需要在数字周围加上引号。在使用switch语句时,不能混合数字和字符串。