如果前面有匹配的大小写,是否会评估开关语句的默认值?
前任:
switch ($x) {
case ($x > 5): print "foo";
case ($x%2 == 0): print "bar";
default: print "nope";
}
所以对于 x = 50,你会看到foo
和bar
,或者foo
和bar
和nope
?
,如果没有"中断",则将执行第一个匹配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,它后面的所有情况都将被执行(包括默认值)。