切换评估

Mat*_*att 0 php switch-statement

我最近讨论了如何switch处理比较,并需要帮助解决它.

如果我写了switch如下:

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

哪个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";
}
Run Code Online (Sandbox Code Playgroud)

Dav*_*dom 5

对每个人,让我澄清一下:

它相当于B.

它不是"两者",它有时不是它的一部分,有时它是另一部分,它始终是B.要理解为什么有时会看到表明它可能存在的结果A,您需要了解类型强制在PHP中是如何工作的.

如果您在falsey值传递给了"说法" switch,并使用表达式中的cases表示导致一个布尔值,如果你的表达式求他们将只匹配FALSE.


switch基本上是一个巨大的if/ elseif树,它在传递给(表达式的左侧)的值和s(右侧)中的表达式之间执行松散的比较(==而不是).===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";
}
Run Code Online (Sandbox Code Playgroud)

如果我们将其转换为两个if/ elseif树:

:

$x = 0;

if ($x > -1) {
  // It matches here
  echo "case 1";
} else if ($x == -1) {
  // and not here
  echo "case 2";
}
Run Code Online (Sandbox Code Playgroud)

B:

$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";
}
Run Code Online (Sandbox Code Playgroud)