PHP开关案例默认

时间:2012-08-10 14:48:12

标签: php switch-statement default

如果在之前有匹配的情况,是否会对switch语句的默认值进行评估?

例如:

switch ($x) {
  case ($x > 5): print "foo";
  case ($x%2 == 0): print "bar";
  default: print "nope";
}

因此,对于x = 50,您会看到foobar,或foo以及barnope

4 个答案:

答案 0 :(得分:6)

是的,如果没有“中断”,则将执行匹配的第一个case之后的所有操作。控制流将“落后”所有后续case,并执行每个后续case下的所有操作,直到遇到break;语句,或直到{{switch结束达到了1}}声明。

在您的示例中,如果$ x的值为50,您实际上会看到"nope"

请注意,switch实际上是在switch关键字后面的表达式和case关键字后面的每个表达式之间执行简单的相等性测试。

你的例子很不寻常,因为当$ x的值为0时,它只会显示"foo"。实际上,当$ x的值为0时,你会看到的是“foo bar nope” ”。)

评估case关键字后面的表达式,在您的示例中,示例返回0(如果条件测试为false)或1(如果条件测试为true)。它是switch$x比较的值(0或1)。

答案 1 :(得分:5)

  

如果在之前有匹配的情况,是否会对switch语句的默认值进行评估?

在大多数case中它不应该,因为你经常会有break个。但是在你的情况下,它也会转到default

另外请尽量防止这些单行内容(为了便于阅读):

$x = 10;

switch (true) {
  case ($x > 5):
      print "foo";

  case ($x%2 == 0):
      print "bar";

  default:
      print "nope";
}

将打印foobarnope。所以回答你的问题:是的: - )

答案 2 :(得分:2)

自己尝试一下会更容易。但无论如何,如果你不在案件中使用break,那么它后面的所有案例都将被执行(包括默认值)

答案 3 :(得分:1)

这不是交换机的工作原理。

According to the manual

  

switch语句类似于上面的一系列IF语句   同样的表达。在许多情况下,您可能想要比较相同的   变量(或表达式)具有许多不同的值,并执行a   不同的代码段取决于它等于的值。这是   正是switch语句的用途。

这样的评估
case ($x > 5):

简单等同于

case true:

case false:

取决于$x的值,因为($x > 5) EVALUATION ,而不是 VALUE 。开关比较参数的值以查看它是否等于任何case s。

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

上述代码中的比较等同于

if ($x == ($x > 5)) {
    echo "foo";
} elseif ($x == ($x < 5)) {
    echo "bar";
} else {
    echo "five";
}

(当$x == 50)相当于

if ($x == true) {
    echo "foo";
} elseif ($x == false) {
    echo "bar";
} else {
    echo "five";
}

相当于

if (true) { // $x == true is the same as saying "$x is truthy"
    echo "foo";
} elseif (false) {
    echo "bar";
} else {
    echo "five";
}
然而,

IF ,您使用了switch语句,因为它打算用于(将参数与具体值进行比较):

switch ($x) {
    case 50:
        echo "foo ";
    case 30:
        echo "bar ";
    default:
        echo "foo-bar";
}

$x == 50,您的输出将是

foo bar foo-bar

由于您的案件中没有break

如果您在每个案例的末尾添加了break关键字,那么您只会执行该特定案例的代码。

switch ($x) {
    case 50:
        echo "foo ";
        break;
    case 30:
        echo "bar ";
        break;
    default:
        echo "foo-bar";
        break;
}

输出:

foo