写点什么

【web 开发基础】PHP 的流程控制之多向条件分支结构(switch) -PHP 快速入门 (16)

作者:迷彩
  • 2022-10-27
    广东
  • 本文字数:2041 字

    阅读完需:约 7 分钟

前言

switch 语句和 elseif 相似,也是一种多向条件分支结构,但 if 和 elseif 语句使用布尔表达式或布尔值作为分支条件来进行分支控制;而 switch 语句则用于测试一个表达式的值,并根据测试结果选择执行相应的分支程序,从而实现分支控制.switch 语句由一个控制表达式和多个 case 标签组成,case 标签后紧跟一个代码块,case 标签作为这个代码块的标识.switch 语句的语法格式如下:

<?php//使用switch分支结构, 对小括号中的表达式求值switch(表达式) { //switch 语句必须由花括号开始,且必须由花括号结束,在编程中,圆括号(),方括号[],花括号{}一般是成对出现	//下面的分支中,表达式的值匹配到哪个就执行下面相应的语句块	case 值1:		语句块1;		break; //break用于退出switch语句	case 值2:		语句块2;		break;	case 值3:		语句块3;		break;	......	case 值n:		语句块n;		break;	default:		语句块n+1;		break;}
复制代码


使用 switch 应注意的事项以及 switch 和 if 的区别


这种分支语句的执行是先对 switch 后面括号中的'表达式'求值,然后依次匹配 case 标签后的值 1,值 2,...,值 n 等值,遇到匹配的值即执行对应的执行体;如果所有 case 标签后的值与"表达式"的值都不相等,则执行 default 标签后的代码块。在使用 switch 语句时应该注意以下几点:


  • (1)和 if 语句不同的是,switch 语句后面的控制表达式的数据类型只能是整型或字符串,不能是 boolean 类型。通常这个控制表达式是一个变量名称,虽然 PHP 是弱类型语言,在 switch 后面控制表达式的变量可以是任意的类型的数据,但是,为了保证匹配执行的准确性,最好只使用整型或字符串中的其中一种类型

  • (2)和 if 语句不同的是,switch 语句后面的花括号是必须要有的。而 switch 语句中各 case 标签前后代码块的开始点和结束非常清晰,因此完全没有必要为 case 后的代码块加括号

  • (3)case 语句的个数没有规定,可以无限增加。但 case 标签和 case 标签后面的值之间应有一个空格,值后面必须有一个冒号,这是语法的一部分

  • (4)switch 匹配完成以后,将依次逐条执行匹配的分支模块中的语句,直到 switch 结构结束或者遇到 break 语句才停止执行。所以,如果一条分支语句的后面没有写上 break 语句,则程序将继续执行下一条分支语句的内容。

  • (5)与 if 语句中的 else 类似,switch 语句中的 default 标签直接在后面加上一个冒号,看似没有条件,其实是有条件的,条件就是“表达式”的值不能与前面任何一个 case 标签后的值相等,这事才处理 default 分支中的语句。default 标签和 if 中的 else 子句一样,它不是 switch 语句中必须的,可以省略。


编程实践


下面的两个例子使用两种不同的方法实现同样的功能,即都是通过 date()函数获取服务器端时间格式中的星期值,并将其转换为中文的星期值。只是一个用一系列的 elseif 语句,另一个使用 switch 语句实现同样的功能。

if...elseif...结构:

<?php $week = date("D");
if($week == 'Mon'){ echo '星期一';}elseif($week == 'Tue'){ echo '星期二';}elseif($week == 'Wed'){ echo '星期三';}elseif($week == 'Thu'){ echo '星期四';}elseif($week == 'Fri'){ echo '星期五';}elseif($week == 'Sat'){ echo '星期六';}elseif($week == 'Sun'){ echo '星期日';}
复制代码

switch 结构:

<?php$w = date("D");switch($w){	case "Mon": echo '星期一'; break;	case "Tue": echo '星期二'; break;	case "Wed": echo '星期三'; break;	case "Thu": echo '星期四'; break;	case "Fri": echo '星期五'; break;	case "Sat": echo '星期六'; break;	case "Sun": echo '星期日'; break;}
复制代码

执行结果:


注:switch 相当于 if== ,要完全匹配值, 不能用于区间判断

可以看到 switch 语句和具有同样表达式的一系列的 elseif 语句相似,但用 switch 使程序更清晰,可读性更强。两种多路分支结构的使用时机:如果是通过判断一个“表达式的范围”进行分支处理,就要选择使用一系列的 elseif 语句,比如上一节中的分时问候就是对小时变量进行范围判断而采用的 elseif 语句,但很多场合下需要把同一个“变量”或表达式与很多不同的值进行比较。并根据它等于哪个值来执行不同的代码,这正是 switch 语句的用途。在 switch 语句中条件只求值一次并用来和每个 case 语句比较;而在 elseif 语句中条件会再次求值,如果条件比一个简单的比较要复杂的多或者在一个很多次循环中,那么用 switch 语句可能会快一点。


在使用 switch 语句时,还可以在匹配多个值时执行同一个语句块,只要将 case 中的语句设置为空即可,最重要的是不要加 break 语句,这样就将控制转移到下一个 case 中的语句。比如:当值 1 和 2 或 3 任意一个匹配上时,都会执行相同的语句块。

<?php $month = date("m"); //获取当前月份
switch($month) { case 1: case 2: print("冬季"); break; case 3: case 4: case 5: print("春季"); break; case 6: case 7: case 8: print("夏季"); break; case 9: case 10: case 11: print("秋季"); break; case 12: print("冬季"); break; }
复制代码

执行结果:


用户头像

迷彩

关注

我的工作是常年写bug|公众号:编程架构之美 2020-06-18 加入

修bug的菜鸟~公众号:“互联网有啥事”已改名为“编程架构之美”

评论

发布
暂无评论
【web 开发基础】PHP 的流程控制之多向条件分支结构(switch) -PHP 快速入门 (16)_switch case_迷彩_InfoQ写作社区