5

将整数 0 作为开关参数将采用第一个结果“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;

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

4

3 回答 3

7

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

比较运算符

[...]如果您将数字与字符串进行比较,或者比较涉及数字字符串,则每个字符串都将转换为数字并以数字方式进行比较。这些规则也适用于 switch 语句。[...]

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

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

$data = 0;
switch ((string) $data): ## <- changed this
    case "anything":
        echo "foo";
        break;
    case "0":            ## <- and this
        echo "zero";
        break;
    default: 
        echo "bar";
endswitch;
于 2013-11-11T08:27:48.287 回答
2

Switch/case 语句使用“loose-comparison”(即==。在这种情况下,0也意味着false1意味着true。(http://www.php.net/manual/en/types.comparisons.php#types.comparisons-loose

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

1)按照@zzlalani 的建议,添加引号。

   case '0': ...

2) 显式转换 switch 语句以强制进行严格比较 ( ===)

    switch((string)($data)) { ... }
于 2013-11-11T09:15:18.433 回答
1

这样做

$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不进行“严格类型”检查。

于 2013-11-11T07:54:17.127 回答