如果之前有匹配的案例,是否会评估 switch 语句的默认值?
前任:
switch ($x) {
case ($x > 5): print "foo";
case ($x%2 == 0): print "bar";
default: print "nope";
}
所以对于 x = 50,你会看到foo
and bar
, or foo
and bar
and nope
?
如果之前有匹配的案例,是否会评估 switch 语句的默认值?
前任:
switch ($x) {
case ($x > 5): print "foo";
case ($x%2 == 0): print "bar";
default: print "nope";
}
所以对于 x = 50,你会看到foo
and bar
, or foo
and bar
and nope
?
是的,如果没有“break”,那么第一个case
匹配之后的所有动作都将被执行。控制流将“遍历”所有后续case
,并执行每个后续下的所有操作case
,直到break;
遇到语句,或者直到switch
到达语句的末尾。
在您的示例中,如果 $x 的值为 50,您实际上会看到"nope"
.
请注意,这switch
实际上是在关键字后面的表达式switch
和关键字后面的每个表达式之间执行简单的相等测试case
。
您的示例很不寻常,因为它只会在 $x 的值为 0 时显示"foo"
。(实际上,当 $x 的值为 0 时,您会看到“foo bar nope”。)
评估关键字后面的表达式case
,在您的情况下,示例返回 0(如果条件测试为假)或 1(如果条件测试为真)。它是那个值(0 或 1)switch
将与$x
.
如果之前有匹配的案例,是否会评估 switch 语句的默认值?
在大多数case
s 中它不应该,因为你经常会有break
s 在那里。但是,在您的情况下,它也会转到default
.
另外请尽量防止做那些单行的东西(为了可读性):
$x = 10;
switch (true) {
case ($x > 5):
print "foo";
case ($x%2 == 0):
print "bar";
default:
print "nope";
}
将打印foobarnope
。所以回答你的问题:是的:-)
自己尝试会更容易。
但是无论如何,如果你不在一个case中使用break,它后面的所有case都会被执行(包括默认的)。
这不是开关的工作方式。
根据手册:
switch 语句类似于同一表达式上的一系列 IF 语句。在许多情况下,您可能希望将同一个变量(或表达式)与许多不同的值进行比较,并根据它等于哪个值来执行不同的代码。这正是 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