【web 开发基础】PHP 的流程控制之多向条件分支结构(switch) -PHP 快速入门 (16)
前言
switch 语句和 elseif 相似,也是一种多向条件分支结构,但 if 和 elseif 语句使用布尔表达式或布尔值作为分支条件来进行分支控制;而 switch 语句则用于测试一个表达式的值,并根据测试结果选择执行相应的分支程序,从而实现分支控制.switch 语句由一个控制表达式和多个 case 标签组成,case 标签后紧跟一个代码块,case 标签作为这个代码块的标识.switch 语句的语法格式如下:
使用 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...结构:
switch 结构:
执行结果:
注:switch 相当于 if== ,要完全匹配值, 不能用于区间判断
可以看到 switch 语句和具有同样表达式的一系列的 elseif 语句相似,但用 switch 使程序更清晰,可读性更强。两种多路分支结构的使用时机:如果是通过判断一个“表达式的范围”进行分支处理,就要选择使用一系列的 elseif 语句,比如上一节中的分时问候就是对小时变量进行范围判断而采用的 elseif 语句,但很多场合下需要把同一个“变量”或表达式与很多不同的值进行比较。并根据它等于哪个值来执行不同的代码,这正是 switch 语句的用途。在 switch 语句中条件只求值一次并用来和每个 case 语句比较;而在 elseif 语句中条件会再次求值,如果条件比一个简单的比较要复杂的多或者在一个很多次循环中,那么用 switch 语句可能会快一点。
在使用 switch 语句时,还可以在匹配多个值时执行同一个语句块,只要将 case 中的语句设置为空即可,最重要的是不要加 break 语句,这样就将控制转移到下一个 case 中的语句。比如:当值 1 和 2 或 3 任意一个匹配上时,都会执行相同的语句块。
执行结果:
评论