将整数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;
如何更改此设置,以便开关按预期写入“零”?
答案 0 :(得分:4)
switch / case语句使用松散比较,不管你喜欢与否,0 == "anything"
是true
:
[...]如果您将数字与字符串进行比较或比较涉及 数字字符串,然后每个字符串转换为一个数字和 比较数字化。这些规则也适用于交换机 声明。 [...]
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
也表示false
而1
也表示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
没有执行“严格类型”检查。