switch
(PHP 4, PHP 5, PHP 7, PHP 8)
switch
语句类似于对同一表达式的一系列 IF 语句。在很多情况下,您可能希望将同一个变量(或表达式)与许多不同的值进行比较,并根据它等于哪个值来执行不同的代码段。这正是 switch
语句的用途。
注意:请注意,与其他一些语言不同,continue 语句适用于 switch
并且其作用类似于 break
。如果您在循环中有一个 switch
并希望继续执行外部循环的下一轮迭代,请使用 continue 2
。
注意:
请注意,switch/case 进行宽松比较。
在以下示例中,每个代码块都是等效的。一个使用一系列 if
和 elseif
语句,另一个使用 switch
语句。在每种情况下,输出都是相同的。
示例 #1 switch
结构
<?php
// 此 switch 语句:
switch ($i) {
case 0:
echo "i 等于 0";
break;
case 1:
echo "i 等于 1";
break;
case 2:
echo "i 等于 2";
break;
}
// 等效于:
if ($i == 0) {
echo "i 等于 0";
} elseif ($i == 1) {
echo "i 等于 1";
} elseif ($i == 2) {
echo "i 等于 2";
}
?>
了解 switch
语句如何执行以避免错误非常重要。 switch
语句逐行(实际上是逐语句)执行。一开始,没有代码被执行。只有当找到一个 case
语句,其表达式的计算结果与 switch
表达式的值匹配时,PHP 才会开始执行语句。PHP 会继续执行语句,直到 switch
块的末尾,或者第一次看到 break
语句。如果您没有在 case 的语句列表的末尾编写 break
语句,PHP 将继续执行后续 case 的语句。例如
这里,如果 $i 等于 0,PHP 将执行所有 echo 语句!如果 $i 等于 1,PHP 将执行最后两个 echo 语句。只有当 $i 等于 2 时,您才会获得预期的行为(将显示“i 等于 2”)。因此,务必不要忘记 break
语句(即使您可能希望在某些情况下有意避免提供它们)。
在 switch
语句中,条件仅评估一次,结果与每个 case
语句进行比较。在 elseif
语句中,条件将再次评估。如果您的条件比简单的比较更复杂,或者在紧密的循环中,switch
可能更快。
case 的语句列表也可以为空,这只是将控制权传递到下一个 case 的语句列表中。
default
case 是一种特殊情况。此 case 匹配任何未由其他 case 匹配的内容。例如
注意:多个 default case 将引发 E_COMPILE_ERROR
错误。
注意:从技术上讲,default
case 可以按任何顺序列出。只有在没有其他 case 匹配时才会使用它。但是,按照惯例,最好将其放在末尾作为最后一个分支。
如果没有 case
分支匹配,并且没有 default
分支,则不会执行任何代码,就像没有 if
语句为真一样。
case 值可以作为表达式给出。但是,该表达式将被单独评估,然后与 switch 值进行宽松比较。这意味着它不能用于 switch 值的复杂评估。例如
对于更复杂的比较,值 true
可用作 switch 值。或者,可以使用 if
-else
块而不是 switch
。
switch 语句支持控制结构的替代语法。有关更多信息,请参阅 控制结构的替代语法。
可以在 case 后使用分号代替冒号,例如