如何在PHP中使用带整数0的开关?

时间:2013-11-11 07:53:14

标签: php comparison-operators

将整数0作为switch参数将获取第一个结果“foo”:

$data=0; // $data is usually coming from somewhere else, set to 0 here to show the problem
switch ($data) :
    case "anything":
        echo "foo";
        break;
    case 0:
        echo "zero";
        break;
    default: 
        echo "bar";
endswitch;

如何更改此设置,以便开关按预期写入“零”?

3 个答案:

答案 0 :(得分:4)

switch / case语句使用松散比较,不管你喜欢与否,0 == "anything"true

  

Comparison Operators

     

[...]如果您将数字与字符串进行比较或比较涉及   数字字符串,然后每个字符串转换为一个数字和   比较数字化。这些规则也适用于交换机   声明。 [...]

var_dump(0 == "a"); // 0 == 0 -> true

一种解决方案是将所有case语句更改为string,并进行字符串比较:

$data = 0;
switch ((string) $data): ## <- changed this
    case "anything":
        echo "foo";
        break;
    case "0":            ## <- and this
        echo "zero";
        break;
    default: 
        echo "bar";
endswitch;

答案 1 :(得分:1)

Switch / case语句使用“松散比较”(即==。在这种情况下,0也表示false1也表示true 。(http://www.php.net/manual/en/types.comparisons.php#types.comparisions-loose

为了避免这个问题,有两个解决方案:

1)根据@zzlalani的建议,添加引号。

   case '0': ...

2)明确地转换switch语句以强制进行严格比较(===

    switch((string)($data)) { ... }

答案 2 :(得分:0)

这样做

$data=0;
switch ($data)
{
    case 0:
        echo "bar";
        break;
    default: 
        echo "foo";
    break;
}

编辑:

  

如何更改此设置,以便开关按预期写入“零”?

您需要移动上面的案例陈述。

$data=0;
switch ($data) :
    case 0:            // Moved this case to the begining
        echo "zero";
        break;

    case "anything":
        echo "foo";
        break;
    default: 
        echo "bar";
endswitch;

这是因为 switch 没有执行“严格类型”检查。