0

我最近就如何处理比较发生了争论switch,需要帮助解决它。

如果我写一个switch例如:

switch ($x){
    case ($x > 5):
        echo "foo";
        break;
    case ($x < 5):
        echo "bar";
        break;
    default:
        echo "five";
        break;
}

if它相当于哪个语句?还是

// 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";
}
4

3 回答 3

5

给大家澄清一下:

它相当于B

它不是“两者”,有时不是它的一个,有时是另一个,它总是B。要了解为什么有时会看到表明它可能是的结果A,您需要了解类型强制在 PHP 中是如何工作的

如果您将虚假值传递给 of 的“参数”,switch并且您在s 中使用导致布尔值的表达式case,则只有当您的表达式计算结果为 时,它们才会匹配FALSE


switch基本上是一个巨大的if/树,它在传递给(表达式的左侧)和s 中的表达式(右侧)之间elseif执行松散的比较(==而不是)。===switchcase

可以通过您的代码的变体很好地证明:

$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";
}
于 2012-08-10T15:33:45.327 回答
2

那个switch case等价于B

编辑 :

如果我们以 $x 等于 0 为例:

$x > 5 将计算为假(0 也计算为假),所以第一个 if 将打印 bar,但第二个将打印 foo。开关将被转换成这样的东西:

switch ($x){
    case false:
        echo "foo";
        break;
    case true:
        echo "bar";
        break;
    default:
        echo "five";
        break;
}

这将打印 foo (与 B 相同)

编辑 2:

我试过了,结果给了我:

$x = 0 => switch (foo), if A (bar), if B (foo)

$x = 5 => switch (5), if A (5), if B (5)

$x = 7 => switch (foo), if A (foo), if B (foo)

于 2012-08-10T15:29:23.910 回答
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;
}
于 2012-08-10T15:33:31.713 回答