最近,我讨论了switch如何处理比较,并需要帮助解决这个问题。
如果我编写了一个switch,如:
switch ($x){
case ($x > 5):
echo "foo";
break;
case ($x < 5):
echo "bar";
break;
default:
echo "five";
break;
}它相当于哪条if语句?A还是B
// A
if ($x > 5) {
echo "foo";
} elseif ($x < 5) {
echo "bar";
} else {
echo "five";
}
// B
if ($x == ($x > 5)) {
echo "foo";
} elseif ($x == ($x < 5)) {
echo "bar";
} else {
echo "five";
}发布于 2012-08-10 15:33:45
请允许我向大家澄清:
它与B**.** 等价
它不是“两者兼而有之”,它有时不是它的一个,有时是另一个,它总是B。要理解为什么有时会看到可能是A的结果,您需要了解类型强制在PHP中的工作方式。
如果将falsey值传递给switch的“参数”,并且在case中使用表达式,从而产生布尔值,则只有当表达式的计算结果为FALSE时,它们才会匹配。
switch基本上是一个巨大的if/elseif树,它在传递给switch (表达式左侧)的值与cases中的表达式(右侧)之间执行松散的比较(==而不是===)。
这个可以证明与您的代码有很好的不同之处:
$x = 0;
switch ($x) {
case $x > -1: // This is TRUE, but 0 == FALSE so this won't match
echo "case 1";
case $x == -1: // This is FALSE, and 0 == FALSE so this will match
echo "case 2";
}如果我们将其转换为两个if/elseif树:
一个
$x = 0;
if ($x > -1) {
// It matches here
echo "case 1";
} else if ($x == -1) {
// and not here
echo "case 2";
}B
$x = 0;
if ($x == ($x > -1)) {
// It doesn't match here
echo "case 1";
} else if ($x == ($x == -1)) {
// ..but here instead
echo "case 2";
}发布于 2012-08-10 15:29:23
那个开关箱相当于B。
编辑:
例如,如果$x等于0:
$x >5将计算为false (0也将计算为false ),因此第一个if将打印条形图,而第二个则将打印foo。开关将被转换为如下所示:
switch ($x){
case false:
echo "foo";
break;
case true:
echo "bar";
break;
default:
echo "five";
break;
}这将打印foo (与B相同)
编辑2 :
我试过了,所以这让我:
使用$x =0 =>开关(foo),如果A (bar),如果B (foo)
用$x =5 =>开关(5),如果A(5),如果B(5)
$x =7 =>开关(foo),if A (foo),if B (foo)
发布于 2012-08-10 15:33:31
您的示例等价于B。
如果您想在您的交换机中使用比较(并且等效于A),您可以这样写:
switch (true) { // Use true instead of $x
case ($x > 5):
echo "foo";
break;
case ($x < 5):
echo "bar";
break;
default:
echo "five";
break;
}https://stackoverflow.com/questions/11904754
复制相似问题