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 后面使用分号而不是冒号,例如