Php 开关评估

Php 开关评估,php,switch-statement,Php,Switch Statement,我最近就switch如何处理比较发生了一场争论,需要帮助解决这个问题 如果我写入一个开关,例如: 那个开关箱相当于B 编辑: 如果我们以$x等于0为例: $x>5将计算为false,0也将计算为false,因此第一个if将打印条,但第二个if将打印foo。 该开关将转换为如下所示: switch ($x){ case false: echo "foo"; break; case true: echo "bar"; b

我最近就switch如何处理比较发生了一场争论,需要帮助解决这个问题

如果我写入一个开关,例如:


那个开关箱相当于B

编辑:

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

$x>5将计算为false,0也将计算为false,因此第一个if将打印条,但第二个if将打印foo。 该开关将转换为如下所示:

switch ($x){
    case false:
        echo "foo";
        break;
    case true:
        echo "bar";
        break;
    default:
        echo "five";
        break;
}
这将打印foo和B相同

编辑2:

我试了一下,结果发现:

使用$x=0=>切换foo,如果是条,如果是B foo

如果$x=5=>切换五,如果A五,如果B五


使用$x=7=>开关foo,如果是A foo,如果是B foo,那么您的示例就相当于B

如果您希望在交换机中使用比较,并将其等效为A,则可以编写以下代码:

开关true{//使用true而不是$x 案例$x>5: 埃科富; 打破 案例$x<5: 回波条; 打破 违约: 回声五; 打破 }
让我向大家澄清:

它相当于B

不是两者都有,有时不是一个,有时是另一个,总是B。要理解为什么你有时看到结果表明它可能是A,你需要理解

如果您向switch的参数传递一个FALSE值,并且您在案例中使用的表达式会产生布尔值,那么只有当表达式的计算结果为FALSE时,它们才会匹配

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

这与您的代码上的一个变体非常好:

$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树:

:

:


我知道是B,但我需要更多的解释来解决这个争论。文档中的一些注释表明它可能是A。那么您是说上面的代码将等效于A?
switch ($x){
    case false:
        echo "foo";
        break;
    case true:
        echo "bar";
        break;
    default:
        echo "five";
        break;
}
$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";
}
$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";
}