切换评估


Switch evaluations

我最近就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)