switch
语句类似于具有同一个判断条件(表达式)的一系列 if
语句。很多场合下需要把同一个变量(或表达式)与很多不同的值比较,并根据它等于哪个值来执行不同的代码。这正是 switch
语句的用途。switch
语句一般与case
语句一起使用,其实switch
语句可以实现的功能完全可以由if
语句替代,但是使用switch
语句语法上更加直观,也可以算作语法糖的一种。
switch…case… 语句
以下代码将会输出:i 等于 1。
$i = 1;
switch ($i) {
case 0:
echo "i 等于 0";
break;
case 1:
echo "i 等于 1";
break;
case 2:
echo "i 等于 2";
break;
}
上面的代码完全可以使用if
语句实现,具体如下:
$i = 1;
if ($i == 0) {
echo "i 等于 0";
} elseif ($i == 1) {
echo "i 等于 1";
} elseif ($i == 2) {
echo "i 等于 2";
?>
在简单的判断情况下,if
语句的代码可能更少,但是如果存在大量复杂的判断,那么switch
语句则更加直观。同时,在 switch
语句中条件只求值一次并用来和每个 case
语句比较。在 elseif
语句中条件会再次求值。如果表达式逻辑比较复杂或者在一个很多次的循环中,那么用 switch
语句可能会快一些。
break 语句
switch
语句是一行接一行地执行(实际上是语句接语句)。开始时没有代码被执行。仅当一个 case
语句中的值和 switch
表达式的值匹配时 PHP 才开始执行语句,直到 switch
的程序段结束或者遇到第一个 break
语句为止。因此switch
语句一般也要包含break
语句。如果不在 case 的语句段最后写上 break
的话,PHP 将继续执行下一个 case 中的语句段。例如:
<?php
switch ($i) {
case 0:
echo "i 等于 0";
case 1:
echo "i 等于 1";
case 2:
echo "i 等于 2";
}
?>
这里如果 $i 等于 0,PHP 将执行所有的 echo 语句!如果 $i 等于 1,PHP 将执行后面两条 echo 语句。只有当 $i 等于 2 时,才会得到“预期”的结果——只显示“i 等于 2”。所以,在非特殊情况下千万别忘了 break
语句,否则就可能导致意想不到的bug。
case 中的语句可以为空
case 中的语句也可以为空,这样只不过将控制转移到了下一个 case 中的语句。
<?php
switch ($i) {
case 0:
case 1:
case 2:
echo "i is less than 3 but not negative";
break;
case 3:
echo "i is 3";
}
?>
default 语句
一个 case 的特例是 default
。它匹配了任何和其它 case 都不匹配的情况。例如:
<?php
switch ($i) {
case 0:
echo "i equals 0";
break;
case 1:
echo "i equals 1";
break;
case 2:
echo "i equals 2";
break;
default:
echo "i is not equal to 0, 1 or 2";
}
?>
注意: 如果有多个 default 将导致
E_COMPILE_ERROR
错误。
注意: 从技术上讲,
default
case 可以按照任何顺序列出。只有在没有匹配到其它的 case 时才会使用它。但是最好按照惯例,将其作为最后一个分支放在最后。
如果没有匹配到 case
分支且没有 default
分支,则不会执行任何代码,就像 if
不为 true 一样。
在 case 语句中使用表达式
case 的值可以使用表达式。然而,该表达式将会自我求值,然后与 switch 的值进行松散比较。这意味着它不适合用于复杂的 switch 值求值。例如:
<?php
$target = 1;
$start = 3;
switch ($target) {
case $start - 1:
print "A";
break;
case $start - 2:
print "B";
break;
case $start - 3:
print "C";
break;
case $start - 4:
print "D";
break;
}
// 输出“B”
?>
对于更复杂的比较,值 true
可用于 switch 的值。或使用 if
–else
代替 switch
。
<?php
$offset = 1;
$start = 3;
switch (true) {
case $start - $offset === 1:
print "A";
break;
case $start - $offset === 2:
print "B";
break;
case $start - $offset === 3:
print "C";
break;
case $start - $offset === 4:
print "D";
break;
}
// 输出“B”
?>
switch 语句的替代语法
switch
也支持替代语法的流程控制。
<?php
switch ($i):
case 0:
echo "i equals 0";
break;
case 1:
echo "i equals 1";
break;
case 2:
echo "i equals 2";
break;
default:
echo "i is not equal to 0, 1 or 2";
endswitch;
?>
允许使用分号代替 case 语句后的冒号,例如:
<?php
switch($beer)
{
case 'tuborg';
case 'carlsberg';
case 'stella';
case 'heineken';
echo 'Good choice';
break;
default;
echo 'Please make a new selection...';
break;
}
?>
本站部分资源来源于网络,仅限用于学习和研究目的,请勿用于其他用途。
如有侵权请发送邮件至1943759704@qq.com删除
码农资源网 » PHP switch 语句详解