流程控制对于任何一门编程语言来说都是至关重要的,它提供了控制程序步骤的基本手段,是程序的核心部分。可以说,缺少了控制流程,就不会有程序设计语言,因为现在没有哪一种程序只是线性地执行语句序列。程序中需要与用户相互交流,需要根据用户的输入决定执行序列,需要有循环将代码反复执行等,这些都少不了流程控制。在任何一门程序设计语言中,都需要支持满足程序结构化所需要的三种基本结构:顺序结构、分支结构(选择结构或条件结构)和循环结构。在 PHP 中,为支持这三种结构,提供了实现这三种结构所需的语句。在程序结构中,最基本的就是顺序结构。顺序结构就是语句按出现的先后次序会按照自上而下的顺序执行,在 PHP 的程序设计语言中,顺序结构的语句主要是赋值语句、输入/输出语句等。所以对于顺序结构就不必多介绍了。
顺序结构的程序虽然能解决计算、输出等问题,但不能先做判断再选择。对于要先做判断再选择的问题就要使用分支结构,又称为选择结构或条件结构。分支结构的执行是依据一定的条件选择执行路径,而不是严格按照语句出现的物理顺序.分支结构的程序设计方法的关键在于构造合适的分支条件和分析程序流程,根据不同的程序流程选择适当的分支语句。分支结构适合于带有逻辑或关系比较等条件判断的计算。即程序在执行过程中依照条件的结果来改变程序执行的顺序。满足条件时执行某一叙述块,反之则执行另一叙述块。在程序中使用分支结构可以有以下几种形式;
>单一条件分支结构(if)
>双向条件分支结构(else从句)
>多向条件分支结构(elseif子句)
>巢状条件分支结构(switch语句)
以上4种分支结构都是对条件进行判断,根据判断结果,选择执行不同的分支。但是要根据程序的不同需求和不同时机,选择以上不同形式的分支结构使用。每种分支结构都是通过相应的 PHP 语句来完成的。
条件语句用于在不同条件下执行不同的动作。
在 PHP 中,我们可以使用以下条件语句:
- if 语句 - 如果指定条件为真,则执行代码
- if…else 语句 - 如果条件为true,则执行代码;如果条件为 false,则执行另一端代码
- if…elseif….else 语句 - 选择若干段代码块之一来执行
- switch 语句 - 语句多个代码块之一来执行
if - else条件语句
<?php
function getLevel ($score) {
if ($score >=90) {
return "优秀";
} else if ($score >=80) {
return "良好";
} else {
return "一般";
}
}
echo getLevel(91); //输出"优秀"
?>
switch 语句和 elseif 相似,也是一种多向条件分支结构,但i f 和 elseif 语句使用布尔表达式或布尔值作为分支条件来进行分支控制;而 switch 语句则用于测试一个表达式的值,并根据测试结果选择执行相应的分支程序,从而实现分支控制。 switch 语句由一个控制表达式和多个 case 标签组成, case 标签后紧跟一个代码块, case 标签作为这个代码块的标识。
switch 语句的语法格式如下:
switch (表达式) //使用 switch 关键字,对后面小括号中的表达式求值
{ // switch 语句必须由花括号开始
case 值1: //如果表达式的值和“值!”匹配则执行下面的语句块
语句块1; //匹配成功则执行的语句块,可以是多条语句
break; //break用于退出 switch 语句
case 值2: //如果表达式的值和“值2”匹配则执行下面的语句块
语句块2; //匹配成功则执行的语句块,可以是多条语句
break ; //break 用于退出 switch 语句
…… //case 语句的个数没有规定,可以无限的增加
case 值 n: //如果表达式的值和“值”匹配则执行下面的语句块
语句块 n; //匹配成功则执行的语句块,可以是多条语句
break ; //break 用于退出 switch 语句
default : //它匹配了任何和其他 case 都不匹配的情况,要放在最后一个 ease 之后,可以省略
语句块n+1; //配成功则执行的语句块,可以是多条语句
} //switch 语句必须由花括号结東
这种分支语句的执行是先对 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 标签后的值相等,这时才处理 defant 分支中的语句。 default 标签和 if 中的 else 子句一样,它不是 switch 语句中必需的,可以省略。
switch 语句和具有同样表达式的一系列的 elseif 语句相似,但用 switch 使程序更清晰,可读性更强。两种多路分支结构的使用时机:如果是通过判断一个“表达式的范围”进行分支处理,就要选择使用一系列的 elseif 语句,例如上一节中的分时问候就是对小时变量进行范围判断,而采用的 elseif 语句。但很多场合下需要把同一个“变量(或表达式)与很多不同的值比较”,并根据它等于哪个值来执行不同的代码,这正是 switch 语句的用途。在 switch 语句中条件只求值一次并用来和每个 case 语句比较。在 elseif 语句中条件会再次求值。如果条件比一个简单的比较要复杂得多或者在一个很多次的循环中,那么用 switch 语句可能会快一些。
在使用 switch 语句时,还可以在匹配多个值时执行同一个语句块。只要将 case 中的语句设置为空,最重要的是不要加 break 语句,这样就将控制转移到了下一个 case 中的语句。例如,当和值0、1或2任意一个匹配上时,都会执行相同的语句块。如下所示:
<?php
$result = "一般";
function getLevel ($score) {
switch (intval($score/10)) { //intval()可以吧变量转换为int型
case 10:
case 9:
return "优秀";
case 8:
$result = "良好";
break;
default :
$result = "一般";
break;
}
return $result;
}
echo $result;
echo getLevel(91);
?>