切换评估

时间:2012-08-10 15:26:00

标签: php switch-statement

我最近讨论了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";
}

3 个答案:

答案 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;
}