PHP 开关大小写默认


PHP switch case default

如果前面有匹配的大小写,是否会评估开关语句的默认值?

前任:

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

所以对于 x = 50,你会看到foobar,或者foobarnope

是的

,如果没有"中断",则将执行第一个匹配case之后的所有操作。控制流将"落入"所有后续case,并执行每个后续case下的所有操作,直到遇到break;语句,或者直到到达switch语句的末尾。

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

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

您的示例不寻常,因为它仅在$x值为 0 时才显示"foo"。(实际上,当$x的值为 0 时,您会看到的是"foo bar nope"。

计算 case 关键字后面的表达式,在您的情况下,示例返回 0(如果条件测试为 false)或 1(如果条件测试为 true)。switch将与$x进行比较的值(0 或 1)就是这个值。

如果 switch 语句的默认值前面有匹配的大小写,是否会对其进行评估?

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

另外,请尽量防止做那些单行的事情(为了可读性):

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

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

这不是开关的工作方式。

根据手册:

switch 语句类似于 相同的表达式。在很多情况下,您可能希望比较相同的 具有许多不同值的变量(或表达式),并执行 不同的代码段,具体取决于它等于哪个值。这是 开关语句的用途正是。

像这样的评估

case ($x > 5):

简单地等同于

case true:

case false:

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

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

但是,如果您使用了 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 

自己尝试会更容易。

但无论如何,如果你在案例中不使用 break,它后面的所有情况都将被执行(包括默认值)。