PHP语法基础篇(五):流程控制
任何 PHP 脚本都是由一系列语句构成的。一条语句可以是一个赋值语句,一个函数调用,一个循环,一个条件语句或者甚至是一个什么也不做的语句(空语句)。语句通常以分号结束。此外,还可以用花括号将一组语句封装成一个语句组。语句组本身可以当作是一行语句。本篇文章将记录流程控制的学习过程。
目录
一、条件语句
1、if 语句
2、if...else 语句
3、if...elseif...else 语句
4、switch 语句
4.1、break 关键字
4.2、default 关键字
4.3、公共代码块
二、循环
1、while 循环
2、do...while 循环
3、for 循环
4、foreach 循环
三、break 语句
四、continue 语句
一、条件语句
- if 语句 - 如果某个条件为真,则执行一些代码。
- if...else 语句 - 如果一个条件为真,则执行一些代码,如果该条件为假,则执行另一段代码。
- if...elseif...else 语句 - 对两个以上的条件执行不同的代码。
- switch 语句 - 选择要执行的多个代码块之一。
1、if 语句
if 结构是很多语言包括 PHP 在内最重要的特性之一,它允许按照条件执行代码片段。
语法
if (expr) {// 如果 expr 的值为 true,执行此处的代码;
}
示例
$a = 5;
$b = 1;
if ($a > $b) {echo "a > b";
}
if 语句可以使用逻辑运算符进行多个条件的检查。
$month = 3;
if ($month == 1 || $month == 2 || $month == 3) {echo "$month 月是第一季度";
}
if 语句可以无限层地嵌套在其它 if 语句中,这给程序的不同部分的条件执行提供了充分的弹性。
$a = 10;
$b = 8;
$c = 6;
if ($a > $b) {echo "a 大于 b";if ($a > $c) {echo "<br>";echo "a 也大于 c";}
}
2、if...else 语句
经常需要在满足某个条件时执行一组语句,而在不满足该条件时执行其它语句,这正是 else 的功能。else 延伸了 if 语句,可以在 if 语句中的表达式的值为 false 时执行语句。
语法
if (expr) {// 如果 expr 的值为 true,执行此处的代码;
} else {// 如果 expr 的值为 false,执行此处的代码,else 语句不是必需的;
}
示例
$a = 8;
$b = 10;
if ($a > $b) {echo "a 大与 b";
} else {echo "a 不大于 b";
}
3、if...elseif...else 语句
elseif,是 if 和 else 的组合。和 else 一样,它延伸了 if 语句,可以在原来的 if 表达式值为 false 时执行不同语句。但是和 else 不一样的是,它仅在 elseif 的条件表达式值为 true 时执行语句。在一个 if 语句中可以有多个 elseif,其中将会执行第一个表达式值为 true(如果有的话)的 elseif。
语法
if (expr1) {// 如果 expr1 的值为 true,执行此处的代码;
} elseif (expr2) {// 如果 expr1 的值为 false,expr2 的值为 true,执行此处的代码;
} elseif (expr3) {// 如果 expr1 和 expr2 的值都为 false,expr3 的值为 true,执行此处的代码;
}
...
else {// 如果上面的条件都为 false,执行此处的代码;
}
示例
$score = 80;
if ($score >= 90) {echo "优秀";
} elseif ($score >= 80) {echo "良好";
} elseif ($score >= 60) {echo "及格";
} else {echo "不及格";
}
elseif 的语句仅在之前的 if 和所有之前 elseif 的表达式值为 false,并且当前的 elseif 表达式值为 true 时执行。
4、switch 语句
switch 语句类似于具有同一个表达式的一系列 if 语句。很多场合下需要把同一个变量(或表达式)与很多不同的值比较,并根据它等于哪个值来执行不同的代码。
语法
switch (表达式) {case 标签 1:// 代码块;break;case 标签 2:// 代码块;break;case 标签 3:// 代码块;break;...default:// 代码块;
}
- 表达式只计算一次;
- 将表达式的值与每个 case 的值进行比较;
- 如果找到匹配项,则执行相关联的代码块;
- break 关键字会跳出 switch 块;
- 如果没有匹配项,则执行 default 代码块。
示例
$season = "spring";
switch ($season) {case "spring":echo "春天";break;case "summer":echo "夏天";break;case "autumn":echo "秋天";break;case "winter":echo "秋天";break;default:echo "输入有误";
}
4.1、break 关键字
遇到 break 关键字时,它会跳出 switch 块。这将停止执行更多代码,并且不再测试更多 case。最后一个块不需要 break,因为该块无论如何都会结束。
注意:如果不在 case 的语句段最后写上 break,则 PHP 将继续执行下一个 case 中的语句段。即使评估结果与 case 不匹配,下一个 case 也将被执行!
接下来,我们将上面 switch 示例中 case "spring" 代码中的 break 移除,看一下会产生什么效果?
$season = "spring";
switch ($season) {case "spring":echo "春天";case "summer":echo "夏天";break;case "autumn":echo "秋天";break;case "winter":echo "秋天";break;default:echo "输入有误";
}
执行输出“春天夏天”。由此可以验证,当没有 break 语句后,将会执行下一个 case 中的语句段,即使 case 不匹配。所以注意不要缺失 break 语句,以免造成逻辑错误。
4.2、default 关键字
default 关键字指定了在没有 case 匹配时要执行的代码。default 不是必需的。
$season = "chuntian";
switch ($season) {case "spring":echo "春天";case "summer":echo "夏天";break;case "autumn":echo "秋天";break;case "winter":echo "秋天";break;default:echo "输入有误";
}
执行输出“输入有误”。由于 case 都没有得到匹配,则执行 default 语句块中的语句。
4.3、公共代码块
如果想让多个 case 使用相同的代码块,将 case 中的语句置为空,这样就将控制转移到了下一个 case 中的语句。
示例
$month = 6;
switch ($month) {case 1:case 3:case 5:case 7:case 8:case 10:case 12:echo "每月有31天";break;case 4:case 6:case 9:case 11:echo "每月有30天";break;case 2:echo "平年有28天,闰年有29天";break;default:echo "出错了";
}
二、循环
- while - 只要指定条件为真,就循环代码块。
- do...while - 执行代码块一次,然后只要指定条件为真,就重复循环。
- for - 循环代码块指定的次数。
- foreach - 对数组中的每个元素循环代码块。
1、while 循环
while 语句的含意很简单,它告诉 PHP 只要 while 表达式的值为 true 就重复执行嵌套中的循环语句。表达式的值在每次开始循环时检查,所以即使这个值在循环语句中改变了,语句也不会停止执行,直到本次循环结束。如果 while 表达式的值一开始就是 false,则循环语句一次都不会执行。
语法
while (expr) {// 如果 expr 为 true,循环执行此处的代码;如果 expr 为 false,则退出循环
}
示例
// 输出 1~10
$i = 1;
while ($i <= 10) { // 当 $i <= 10 时,输出 $i 的值echo $i;echo "<br>";$i++; // 每次循环更改 $i 的值,在现有值的基础上加1
}
注意:需要更改条件判断的值,否则循环将永远继续。通常将永远执行的循环叫做死循环,要尽量避免死循环的出现。
while 循环不会运行特定次数,而是在每次迭代后检查条件是否为真,以此来判断是否执行下次循环。
2、do...while 循环
do...while 循环和 while 循环非常相似,区别在于表达式的值是在每次循环结束时检查而不是开始时。和一般的 while 循环主要的区别是 do...while 的循环语句保证会执行一次(表达式的真值在每次循环结束后检查),然而在 while 循环中就不一定了(表达式真值在循环开始时检查,如果一开始就为 false 则整个循环立即终止)。
语法
do {// 如果 expr 为 true,循环执行此处的代码;如果 expr 为 false,则退出循环;此处代码在开始时必定执行一次
} while (expr);
示例
$i = 10;
do {echo $i;echo "<br>";$i--;
} while ($i < 5);
// 即使条件为 false,但是循环还是执行了一次
3、for 循环
for 循环 - 循环代码块执行指定的次数。
语法
for (expr1; expr2; expr3) {// 代码块;
}
- 第一个表达式(expr1)在循环开始前无条件求值(并执行)一次。
- expr2 在每次循环开始前求值。如果值为 true,则继续循环,执行循环语句。如果值为 false,则终止循环。
- expr3 在每次循环之后被求值(并执行)。
- 每个表达式都可以为空或包括逗号分隔的多个表达式。表达式 expr2 中,所有用逗号分隔的表达式都会计算,但只取最后一个结果。expr2 为空意味着将无限循环下去。
示例
// 输出 1~10
for ($i = 1; $i <= 10; $i++) {echo $i . "<br>";
}
4、foreach 循环
foreach 语法结构提供了遍历数组的简单方式。foreach 仅能够应用于数组和对象,如果尝试应用于其他数据类型的变量,或者未初始化的变量将发出错误信息。foreach 循环在本篇文章中不做使用说明,在之后的数组篇章中说明如何使用。
三、break 语句
break 语句结束执行当前的 for、foreach、while、do...while、switch 结构。
break 接受一个数字的可选参数,决定跳出几重循环。默认值是 1,仅仅跳出最近一层嵌套结构。
$i = 0;
while (++$i) {switch ($i) {case 5:echo "At 5<br />\n";break 1; /* 只退出 switch. */case 10:echo "At 10; quitting<br />\n";break 2; /* 退出 switch 和 while 循环 */default:break;}
}
四、continue 语句
continue 在循环结构用用来跳过本次循环中剩余的代码并在条件求值为真时开始执行下一次循环。
continue 接受一个可选的数字参数来决定跳过几重循环到循环结尾。默认值是 1,即跳到当前循环末尾。
// 输出 1~10 中的偶数
for ($i = 1; $i <=10; $i++) {if ($i % 2 == 1) { // 跳过奇数continue;}echo $i . "<br>";
}