顺序结构
在前面的所有课程的示例中,大部分都是以顺序结构展示的。所谓顺序结构,就是按照你所书写的代码 从上到下依次 线性执行,没有任何步骤所言。但是如果某种语言只有这样的一种执行方式,那可以说这个语言没有用处,更别提什么设计流程了。类似于赋值、输入,打印等语句都属于顺序结构语句,概念都很简单,这里不再赘述。
分支结构
分支结控制了整个程序的流程,可以做出先判断,再决定执行什么样的代码。相对于顺序结构,他不再按照代码的物理排序的顺序执行,而是有了一定的选择性。
在 PHP 或是所有编程语言中,都包含四种常用的分支结构。他们分别是 单一条件 、 双向条件 、 多项条件 和 嵌套条件 分支结构。他们都会依据你指定的条件来选择程序执行路径;满足则执行,不满足则执行另一个条件。最终返回结果。下面我将依次介绍这几种分支条件的使用方式。
单一条件
想必大家对 if
语句并不陌生吧,单个的 if ()
就是单一条件,这对于包括 PHP 在内的很多语言来说都是最基础最重要的流程控制语句。
用法也是很简单,在 if ()
的括号里写上一个可以返回 布尔值 的输出语句,即可控制程序的流程方向。
if (3 > 2)
echo '3是大于2的';
如果你想在一个判断里执行多个语句,就需要用一对大括号 {}
将他们包裹起来,像这样:
$birthday = '0218';
if (date('md') === $birthday) {
echo '妈诶 女朋友过生日了';
// 伪代码
buyGift();
writeCard();
giveKiss();
# other things
}
怎么样,是不是很简单很好理解。
双向条件
当 if ()
遇到了 else
之后,就产生了 双向条件 。也就是说,当 if ()
里的条件不满足时,将会跳转到 else
这个分支里执行相应代码。像这样:
$status = '清醒';
if ($status != '清醒') {
echo '女朋友过生日我送什么礼物好呢';
} else {
echo '我根本没有女朋友';
}
echo '洗洗睡吧';
如果你的不是清醒的状态,就会输出“女朋友过生日我送什么礼物好呢”反之就会输出“我根本没有女朋友”。但是不管怎么执行,最后那句“洗洗睡吧”一直会按照 顺序结构 执行。
多向条件
elseif 语句
当 if ()
遇到了一个或多个 elseif ()
之后,就构成了 多向条件。在 PHP 中, elseif()
也可以写成 else if()
,他们的意思是一样的。
$money = 300;
if ($money <= 100) {
echo '看电影';
} else if ($money > 100 && $money <= 500) {
echo '买口红';
} else if ($money > 500 && $money <= 1000) {
echo '买化妆品套装';
} else {
// 如果上述条件都不满足
echo '为所欲为';
}
# do other things...
上述示例运行结果会输出:“买口红”,不难看出,像 if ... else if ... else
这样的语句,只要不满足某个条件,就会一次判断每一个 else if()
中的条件,直到满足。并且执行满足条件中的代码后,不会再继续判断后面 else if()
中的条件。
如果我的 $money = 1500
,那就会输出“为所欲为”,因为它每一个条件都不满足,所以执行了最后的 else
语句。所以在日常开发中,这种多向条件的判断结构适合对一个变量进行范围的判断。比如判断一天的时间是上午、中午还是下午...
小提示
在使用 else if()
语句时,尽量把范围最小的判断放在最前面。比如上述例子中, $money <= 100
就比 $money > 100 && $money <= 500
的范围小,所以要把它放在最上面。
switch 语句
还有一个和 if else()
意义差不多的语句: switch
语句。它也是一种多向条件分支结构。不同的是, if
和 else if
使用的是判断语句表达式或布尔值,而 switch
是测试一个表达式的值,并根据结果执行不同的分支。下面,我将用 switch 和 if 做一个对比:
if ($i == 0) {
echo "i equals 0";
} elseif ($i == 1) {
echo "i equals 1";
} elseif ($i == 2) {
echo "i equals 2";
}
上面的代码如果用 switch
来实现,就是一下代码:
switch ($i) {
case 0:
echo "i equals 0";
break;
case 1:
echo "i equals 1";
break;
case 2:
echo "i equals 2";
break;
}
为避免错误,理解 switch
是怎样执行的非常重要。switch 语句一行接一行地执行(实际上是语句接语句)。开始时没有代码被执行。仅当一个 case
语句中的值和 switch
表达式的值匹配时 PHP 才开始执行语句,直到 switch 的程序段结束或者遇到第一个 break
语句为止。如果不在 case
的语句段最后写上 break 的话,PHP 将继续执行下一个 case
中的语句段。例如:
switch ($i) {
case 0:
echo "i equals 0";
case 1:
echo "i equals 1";
case 2:
echo "i equals 2";
}
没有了 break
,当 $i
等于 0 时,就会把 0,1,2 三个语句都执行,输出三句话;当 $i
等于 1 时,就会把 1,2 三个语句都执行,输出两句话... 以此类推。所以,别忘了加上 break
语句。
在 switch 语句中条件只求值一次并用来和每个 case 语句比较。在 elseif 语句中条件会再次求值。如果条件比一个简单的比较要复杂得多或者在一个很多次的循环中,那么用 switch 语句可能会快一些。
在一个 case
中的语句也可以为空,这样只不过将控制转移到了下一个 case 中的语句,这相当于在 if
语句中的 ||
(或),比如,用 if 这样写:
if ($name == "A" || $name == "B" || $name == "C") {
echo 'They are A and B and C';
} else if ($name == "D") {
echo 'This is D';
}
用 switch
就可以这样写:
switch ($name) {
case 'A':
case 'B':
case 'C':
echo "They are A and B and C";
case 'D':
echo "This is D";
break;
}
还记得 if else
中最后一个 else
吗,当所有条件都不满足时,会执行最后一个 else
中的代码。在 switch 中它叫 default
,它匹配了任何和其它 case
都不匹配的情况,默认可以省略不写:
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";
break;
}
你也可以使用分号代替 case
语句后的冒号,例如:
switch($beer)
{
case 'tuborg';
case 'carlsberg';
case 'heineken';
echo 'Good choice';
break;
default;
echo 'Please make a new selection...';
break;
}
嵌套条件
嵌套条件其实就是在 if
语句中包含一个或多个 if
语句,其实不是很建议使用这种嵌套结构,因为一旦眼花,就很容易出错,有时候连自己都会被绕晕。。。
举个例子,某个药品的使用规则是,任何人都可以服用,但是男女使用剂量不同。当然,如果没有病,也不需要使用这个药品,用代码来描述就是:
if ($sex == 'man') {
if ($is_sick === true) {
echo "使用剂量为 12 μg";
} else {
echo "不需要使用该药品";
}
} else {
// 性别为女
if ($is_sick === true) {
echo "使用剂量为 6 μg";
} else {
echo "不需要使用该药品";
}
}
之所以不建议使用嵌套条件,是因为大部分的嵌套条件是可以简化书写的,读起来不会很吃力。比如上述代码可以修改为:
if (!$is_sick) {
echo "不需要使用该药品";
} else {
if ($sex == 'man') {
echo "使用剂量为 12 μg";
} else {
echo "使用剂量为 6 μg";
}
}
最后,在写一些比较复杂的流程控制代码时,可以先自己画一下流程图。不要着急写代码,经验告诉我,有所准备的代码修改量比上来就写的代码少的多得多。
以上就是 PHP 的流程控制语句。