PHP里的循环结构我们已经聊过for、foreach和while。现在还剩下一个do-while循环。它和while循环长得像,但行为上有一个本质区别,这个区别决定了它们在什么场景下各有用武之地。
先记住一个核心结论:while循环是“先问后跑”,条件不满足一次都不执行;do-while循环是“先跑再问”,不管条件如何,至少执行一次循环体。 这个特性让do-while在需要“先执行再验证”的场景里有不可替代的位置。
在计算机术语里,while被称为入口控制循环,因为在进入循环体之前就要检查条件;而do-while被称为出口控制循环,因为条件检查发生在循环体执行完之后。名称很学术,但理解了这个区别,你就能很自然地判断该用谁。
基本语法结构
do-while的语法结构清晰表达出“先执行、后判断”的逻辑顺序。
do {
// 循环体:至少会被执行一次的代码块
} while (条件表达式);
写do-while有一个容易被忽视的细节:结尾的while后面必须跟一个分号(;)。 这个分号是do-while语句的一部分,省略了会导致语法错误。我自己刚开始学PHP时,在这个分号上栽过好几次,因为写while循环不需要它,到了do-while很容易凭惯性漏掉。
本节课程知识要点
在动手写do-while之前,这几个知识点值得你留意。
-
“至少执行一次”是选择
do-while的核心理由。如果你确定代码块必须运行一次(比如展示菜单、读取用户输入、初始化某些状态),然后才根据结果决定是否继续,那do-while比while更贴合语义。 -
分号规则要记牢。
do-while结尾的分号不是装饰,它标志着整个语句的结束。有趣的是,如果在do-while之后没有任何其他语句,PHP在某些情况下允许省略分号,但这不是值得我们依赖的特性。写规范代码,分号必须带。 -
循环体内依然需要改变条件的操作。和
while一样,do-while也可能陷入无限循环。如果你在循环体里忘了让条件趋向于FALSE,程序会卡死。这个原则对任何条件循环都通用。 -
不要拿
do-while去做纯计数循环。计数场景用for更清晰。do-while适合那些“先做事,再根据结果判断是否继续”的逻辑流程。
Do-While与While的核心区别
为了帮你精准区分这两个循环,我们把区别整理成一张直观的对比表。
| 对比维度 | while循环 | do-while循环 |
|---|---|---|
| 控制类型 | 入口控制循环 | 出口控制循环 |
| 条件检查时机 | 先检查条件,再执行循环体 | 先执行循环体,再检查条件 |
| 最少执行次数 | 0次(条件初始为假则不执行) | 1次(无论如何至少执行一轮) |
| 结尾符号 | 不需要分号 | 需要分号; |
| 适用场景 | 次数不确定,且可能不需要执行 | 次数不确定,但必须至少执行一次 |
个人经验分享:在日常开发里,do-while的使用频率确实比while低。但了解它,能让你在别人代码里遇到它时不发怵。我通常在两种情况下会主动用do-while:一是需要向用户展示一个功能菜单,至少显示一次,然后根据选择决定是继续还是退出;二是从数据库或API分页获取数据时,至少拉取第一页,然后判断有没有下一页。这两种模式都是“先做再说”的典型。
核心用法与实例解析
下面通过几个贴近实际编程场景的例子,把do-while的用法讲透。
1. 基础示例:和while效果相同的计数
这个例子展示do-while也能完成基础的计数任务,帮你看懂它的执行流程。
<?php
$num = 1;
do {
echo "当前数字:{$num}<br/>";
$num++;
} while ($num <= 10);
?>
输出从1到10。流程:$num是1,进入循环体打印并加1,然后判断$num <= 10,满足则继续下一轮。当$num变成11时,条件为假,退出。这个效果和while一样,因为初始条件本身是满足的。
2. 体现“至少一次”特性的例子
下面这个例子才能看出do-while和while的根本区别。如果换用while,循环体一次都不会执行。
<?php
$x = 1;
do {
echo "这句话至少会被打印一次。";
$x++;
} while ($x > 10);
echo "<br/>循环结束时,\$x 的值是:{$x}";
?>
输出:
这句话至少会被打印一次。
循环结束时,$x 的值是:2
解释:$x初始为1,条件$x > 10明显是假的。但因为是do-while,循环体先执行,打印一句话并把$x加1变成2,然后才检查条件2 > 10,结果为假,循环退出。如果用while($x > 10),循环体不会执行,$x还是1。这就是do-while存在的原因——它保证了边界情况下逻辑的完整性。
3. 累加求和:多次执行的do-while
这个例子展示一个实用的累加模式,很适合代码号学习编程时理解循环的累积作用。
<?php
$sum = 0;
$i = 1;
do {
$sum += $i; // 把当前$i加到总和里
$i++;
} while ($i <= 4);
echo "从1加到4的总和是:{$sum}";
?>
输出:从1加到4的总和是:10。第一轮:$sum变成1,$i变成2;第二轮:$sum变成3,$i变成3;第三轮:$sum变成6,$i变成4;第四轮:$sum变成10,$i变成5;第五轮条件检查5 <= 4为假,退出。10是正确结果。
4. 倒数计时:递减模式
递增不是do-while的唯一用法,递减同样直观。
<?php
$countdown = 10;
do {
echo "倒计时:{$countdown}<br/>";
$countdown--;
} while ($countdown >= 5);
?>
输出从10倒数到5,每个数字一行。当$countdown减到4时,条件4 >= 5为假,循环结束。这种递减模式在定时任务、批量处理剩余数量的反馈场景里比较常见。
什么场景该用do-while而不是while?
这个问题回归到选择依据上。以下两种情况,do-while是更自然的选择:
-
用户交互菜单:你需要把一个选项列表展示给用户,然后根据输入决定是继续呈现菜单还是退出。菜单至少得显示一次。
-
分页数据拉取:从外部API获取数据,第一页必须先请求,拿到结果后根据返回的“是否有下一页”标记决定是否继续请求。至少需要一次网络调用。
对于其他大多数场景,尤其是“条件可能一开始就不满足,循环体可能不需要执行”的情况,while是更安全的选择。我的主观建议是:默认用while,只在明确需要“保证至少一次”的语义时,才把do-while拿出来用。 这样做,读你代码的人看到do-while这个结构本身,就能接收到“这里最少执行一次”的信号,沟通效率更高。
do-while循环不是PHP里频繁使用的结构,但它在特定场景下有着while无法替代的语义优势。理解“入口控制”和“出口控制”的本质区别,比机械地记住语法重要得多。当你在项目中遇到“先做事再判断”的逻辑需求时,能想到do-while这个选项,说明你对PHP流程控制的理解已经比较扎实了。