程序默认是按从上到下的顺序一行一行执行的。但真实的业务逻辑很少是一条笔直的线——用户登录了是一种流程,没登录是另一种;购物车有商品要结算,空购物车要提示;循环处理数据时找到目标就停,遇到无效数据就跳。所有这些“拐弯”和“分支”,靠的就是PHP控制语句。
控制语句的核心作用就是一句话:赋予程序做决策的能力,根据不同的条件改变代码的执行路径。 它们是程序逻辑的骨架,理解这几类语句的定位和适用场景,比单纯背诵语法要重要得多。
PHP控制语句可以分为三大类:
-
条件判断语句——根据条件真假决定走哪条分支(
if-else、switch) -
循环迭代语句——让一段代码重复执行若干次(
while、do-while、for、foreach) -
跳转语句——在循环或分支结构内部精准控制执行流(
break、continue)
下面逐一梳理,重点放在各语句之间的区别和选择依据上,把前面课程里分散讲的控制结构串成一个体系性的认知。
一、条件判断语句:让程序学会做选择题
条件判断是程序里基础的控制形式。PHP提供了两套条件判断工具:if-elseif-else和switch。它们都能实现多路分支,但适合的场景不同。
If-Elseif-Else语句
当条件判断涉及范围比较或者多个不同变量的组合判断时,if-elseif-else是更自然的选择。
if (条件1) {
// 条件1成立时执行
} elseif (条件2) {
// 条件1不成立但条件2成立时执行
} else {
// 以上条件都不成立时执行
}
使用要点:
-
if可以单独使用,else和elseif是可选的 -
elseif必须跟在if或另一个elseif之后,不能独立出现 -
多个
elseif会从上到下依次检查,第一个匹配的就会被执行,后面的全跳过
实例:根据成绩区间评定等级
<?php
$score = 82;
if ($score >= 90) {
echo "成绩等级:A";
} elseif ($score >= 75) {
echo "成绩等级:B";
} elseif ($score >= 60) {
echo "成绩等级:C";
} else {
echo "成绩等级:D";
}
?>
输出:成绩等级:B。$score是82,不满足第一条>=90,满足第二条>=75,执行B分支,后面的判断不再进行。
实例:根据日期判断月初
<?php
$currentDay = date("d"); // 获取当前日期,比如"05"
echo "今天是:" . $currentDay . "号<br/>";
if ($currentDay < "10") {
echo "现在是月初阶段。";
}
?>
这里if单独使用,没有else,条件不成立时什么都不输出。这种用法在日常开发里很常见——只在特定条件下附加一段逻辑。
Switch语句
当条件判断是拿同一个变量去和多个离散的具体值做匹配时,switch比if-elseif更有结构感。
switch (表达式) {
case 值1:
// 匹配值1时执行
break;
case 值2:
// 匹配值2时执行
break;
default:
// 所有case都不匹配时执行
}
实例:根据等级字母给出评语
<?php
$grade = "B";
switch ($grade) {
case "A+":
echo "表现优异!获得了A+评级。<br/>";
echo "请继续保持这种状态。";
break;
case "A":
echo "很出色!获得了A评级。<br/>";
echo "再进一步就能到A+了。";
break;
case "B":
echo "不错的努力!获得了B评级。<br/>";
echo "加把劲冲上A级。";
break;
case "C":
echo "及格了,C评级。<br/>";
echo "还有比较大的提升空间。";
break;
default:
echo "请输入有效的评级(A+到C之间)。";
}
?>
输出:
不错的努力!获得了B评级。
加把劲冲上A级。
个人经验分享:If-Elseif还是Switch? 选择依据很简单——如果条件是“大于、小于、不等于”这种范围判断,用if-elseif;如果条件是“等于某个具体值”,并且比较的分支超过3个,我会倾向用switch。switch在视觉上更规整,每个case对齐排列,看代码的人一眼就知道这是在做多选一的精确匹配。但如果只有两三个分支,if-else写起来更利落。
二、循环迭代语句:让程序学会重复劳动
循环是编程效率的来源。PHP提供四种循环结构,各有各的服务场景。
| 循环类型 | 适用场景 | 最少执行次数 |
|---|---|---|
while |
循环次数不确定,先判断条件再执行 | 0次 |
do-while |
循环次数不确定,但至少需要执行一次 | 1次 |
for |
循环次数已知或需要明确的计数器管理 | 0次 |
foreach |
遍历数组的每个元素 | 取决于数组元素数 |
While循环:先判断,后执行
<?php
$step = 1;
while ($step <= 5) {
echo "步骤 {$step} 执行中...<br/>";
$step++;
}
?>
输出从1到5。特点是每次进入循环体之前先检查条件,条件为假则一次都不执行。
Do-While循环:先执行,后判断
<?php
$attempt = 1;
do {
echo "第 {$attempt} 次尝试连接服务器...<br/>";
$attempt++;
} while ($attempt <= 3);
?>
do-while保证循环体至少执行一次,哪怕初始条件就是假的。适合“先试一次再说”的场景,比如发起一次网络请求,根据返回结果决定是否重试。
For循环:紧凑的计数型循环
<?php
for ($round = 1; $round <= 5; $round++) {
echo "第 {$round} 轮比赛进行中...<br/>";
}
?>
for把初始化、条件判断、步进集中在一起,结构紧凑。当循环次数事先已知时,它是较直观的选择。
Foreach循环:为数组设计
<?php
$fruitList = ["苹果", "香蕉", "橘子"];
foreach ($fruitList as $fruit) {
echo "当前水果:{$fruit}<br/>";
}
?>
foreach遍历数组时,你不用管理索引、不用调count(),它自动把每个元素取出来。处理关联数组时也能同时拿到键名和值。在代码号学习编程的过程中,处理数组的场景占很大比重,foreach会是你用得较多的一个循环。
主观建议:不要用错循环类型。 我见过有开发者因为习惯了for,连遍历关联数组也用for加数字索引硬套,代码又长又容易出错。每个循环类型都有它设计上的侧重点,用对了,代码的可读性和健壮性都会更胜一筹。
三、跳转语句:精准控制循环体内的执行流
break和continue是一对功能互补的跳转语句,都用在循环或switch结构内部。
Break:彻底退出循环
<?php
for ($num = 1; $num <= 10; $num++) {
if ($num == 4) {
break; // 到4直接退出,后面不跑了
}
echo "数字:{$num}<br/>";
}
?>
输出1、2、3,碰到4时break触发,整个for循环结束。break还用在switch里防止Fall-through穿透。
Continue:跳过本轮,进入下一轮
<?php
for ($num = 1; $num <= 5; $num++) {
if ($num == 3) {
continue; // 跳过3,但循环继续
}
echo "数字:{$num}<br/>";
}
?>
输出1、2、4、5。3被跳过了,但循环没有终止。
两者的区别很清晰:break是“我不干了”;continue是“这轮我不干,下轮接着来”。
本节课程知识要点
把PHP控制语句的学习要点整理一下,便于回顾:
-
条件判断:范围比较用
if-elseif,多路精确匹配用switch。switch的分支超过3个时结构优势更明显。 -
循环选择:知道具体循环次数选
for;不知道次数但可能一次都不执行选while;不知道次数但必须至少执行一次选do-while;遍历数组选foreach。 -
跳转控制:
break终止整个循环或结束switch分支;continue只跳过当前迭代的剩余代码。while和do-while里用continue时注意计数器会不会被跳过。 -
嵌套层级:
break和continue默认只作用于当前层。嵌套循环中需要跨层跳转时,可以加数字参数(如break 2;),但少用为好,可读性会变差。
这三类控制语句构成了PHP程序逻辑的骨架。条件判断决定走哪条路,循环决定重复做多少遍,跳转语句决定何时停下或跳过。把它们之间的关系和各自定位理清楚,面对业务需求时,你就能自然地选出该用的结构,而不是凭惯性一个if-else写到底。