我最近就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";
}
对于大家,让我澄清一下:
它相当于B
.
"两者",有时不是它的一个,有时它是另一个,它总是B
.要理解为什么你有时会看到表明它可能A
的结果,你需要了解类型强制在PHP中是如何工作的。
如果将 false 值传递给 switch
的"参数",并且在case
中使用生成布尔值的表达式,则仅当表达式的计算结果为 FALSE
时,它们才会匹配。
switch
基本上是一个巨大的if
/elseif
树,它在传递给switch
的值(表达式的左侧)和case
s(右侧)中的表达式之间进行松散的比较(==
而不是===
)。
这可以通过代码的变体很好地证明:
$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";
}
乙:
$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";
}
您的示例等效于 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;
}
该开关大小写相当于 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 => 开关 (五),如果 A (五),如果 B(五)
$x = 7 => 开关 (foo),如果 A (foo),如果 B (foo)