Php 开关评估
我最近就switch如何处理比较发生了一场争论,需要帮助解决这个问题 如果我写入一个开关,例如: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
那个开关箱相当于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";
}