do-while在PHP中一定至少执行一次循环体,因其采用“先执行、后判断”机制:无论条件真假,均先无条件执行一遍do块内代码,再检查while后的表达式。

是的,do while 在 PHP 中**一定至少执行一次循环体**,这是它和 while 最根本的区别——判断时机不同。
为什么 do while 一定执行一次?
因为它的执行顺序是:先无条件运行一遍 do 块里的代码,再检查 while 后面的条件表达式。只要语法合法、条件能求值(哪怕一开始就是 false),第一轮就已发生。
比如:
$x = 6;
do {
echo "x is $x\n";
} while ($x <= 5);
输出 x is 6,然后才判断 $x 为 <code>false,退出循环。
立即学习“PHP免费学习笔记(深入)”;
常见错误:把数据库 fetch 写成 do while
最容易出 Notice 的场景是误用 mysqli_fetch_assoc() 或 PDOStatement::fetch():
-
while ($row = mysqli_fetch_assoc($result)) { ... }—— 安全,无结果时根本不进循环 -
do { echo $row['name']; } while ($row = mysqli_fetch_assoc($result));—— 危险!第一次do执行时$row还未赋值,或上一轮已为null,直接访问$row['name']触发Notice: Trying to access array offset on value of type null
正确写法是坚持用 while,或确保 do 块内不依赖未定义的 $row。
do while 真正适合的场景
它不是「while 的替代品」,而是专为「必须干一回,再看要不要重来」设计的。典型用例包括:
- 用户输入校验:
do { $input = readline('Enter number > 10: '); } while ((int)$input - 服务重试(首次调用不可跳过):
do { $res = api_call(); } while ($res === false); - 生成唯一 ID:
do { $id = bin2hex(random_bytes(4)); } while (in_array($id, $used));
注意:如果循环体里有 await 或需异步等待,PHP 的 do while 无法原生支持,得改用函数递归或事件循环封装。
continue 在 do while 里怎么 behave?
continue 不会重新进入 do 块,而是直接跳到 while 条件判断——也就是说,它不「重跑这一轮」,只「决定还跑不跑下一轮」。
例如:
$i = 0;
do {
$i++;
if ($i == 2) continue;
echo "$i ";
} while ($i < 4);
输出是 1 3 4,不是 1 3 3 4。想强制重试整个逻辑块,得用 while(true) + break 或重构流程。
真正容易被忽略的是:do while 的「至少一次」特性在数据为空或状态异常时反而会暴露逻辑漏洞,比如未初始化变量、空数组越界、null 字段访问——它不帮你兜底,只是按规则走完第一步。



















