我最近讨论了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";
}
答案 0 :(得分:5)
对大家来说,让我澄清一下:
相当于B
。
它不是“两者”,有时不是它的,有时它是另一个,它总是B
。要了解您有时会看到表明可能是A
的结果的原因,您需要了解how type coercion works in PHP。
如果将假名值传递给switch
的“参数”,并且在case
中使用表达式导致布尔值,则它们只会如果表达式的计算结果为FALSE
,则匹配。
switch
基本上是一个巨大的if
/ elseif
树,它在传递给{{1}的值之间执行松散的比较(==
而不是===
) (表达式的左侧)和switch
s(右侧)中的表达式。
这个can be proved非常适合代码的变体:
case
如果我们将其转换为两个$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
树:
A:
elseif
B:
$x = 0;
if ($x > -1) {
// It matches here
echo "case 1";
} else if ($x == -1) {
// and not here
echo "case 2";
}
答案 1 :(得分:2)
该开关案例相当于B
修改:
如果我们假设$ x等于0:
$ x&gt; 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 =&gt; switch(foo),如果是A(bar),如果是B(foo)
$ x = 5 =&gt;开关(五),如果A(五),如果B(五)
$ x = 7 =&gt; switch(foo),如果是A(foo),如果是B(foo)
答案 2 :(得分:2)
您的示例相当于 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;
}