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

是的,do while 在 PHP 中**一定至少执行一次循环体**,这是它和 while 最根本的区别——判断时机不同。
为什么 do while 一定执行一次?
因为它的执行顺序是:先无条件运行一遍 do 块里的代码,再检查 while 后面的条件表达式。只要语法合法、条件能求值(哪怕一开始就是 false),第一轮就已发生。
比如:
$x = 6;
do {
echo "x is $x\n";
} while ($x
<p>输出 <code>x is 6</code>,然后才判断 <code>$x 为 <code>false</code>,退出循环。</code></p>
<h3>常见错误:把数据库 fetch 写成 do while</h3>
<p>最容易出 Notice 的场景是误用 <code>mysqli_fetch_assoc()</code> 或 <code>PDOStatement::fetch()</code>:</p>
-
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
<p>输出是 <code>1 3 4</code>,不是 <code>1 3 3 4</code>。想强制重试整个逻辑块,得用 <code>while(true)</code> + <code>break</code> 或重构流程。</p>
<p>真正容易被忽略的是:<code>do while</code> 的「至少一次」特性在数据为空或状态异常时反而会暴露逻辑漏洞,比如未初始化变量、空数组越界、null 字段访问——它不帮你兜底,只是按规则走完第一步。</p>php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











