在PHP中,while 循環(huán)是 PHP 中最基本的循環(huán)類型,其行為與 C 語言中的 while 循環(huán)完全相同;而do-while 循環(huán)和 while 循環(huán)在結(jié)構(gòu)上非常相似,區(qū)別在于do-while 循環(huán)的表達(dá)式值是在每次循環(huán)結(jié)束時進(jìn)行檢查,而 while 循環(huán)則是在開始時進(jìn)行檢查。
一、while語句
while 循環(huán)是 PHP 中最簡單的循環(huán)類型,與C語言中的 while 循環(huán)地一樣。while 語句的基本格式是:
while (expr) statement
while 語句在 PHP 中的作用是,只要 while 表達(dá)式的值為 true,就會重復(fù)執(zhí)行嵌套中的循環(huán)語句。這個表達(dá)式的值會在每次開始循環(huán)時進(jìn)行檢查,因此即使它在循環(huán)語句中發(fā)生了變化,也不會影響循環(huán)的執(zhí)行。如果 while 表達(dá)式的初始值就是 false,那么循環(huán)語句將不會執(zhí)行一次。
和 if 語句一樣,可以在 while 循環(huán)中用花括號括起一個語句組,或者用替代語法:
while (expr): statement ... endwhile;
下面兩個例子完全一樣,都顯示數(shù)字 1 到 10:
<?php /* 示例 1 */ $i = 1; while ($i <= 10) { echo $i++; /* 在自增前(后自增)打印的值將會是 $i */ } /* 示例 2 */ $i = 1; while ($i <= 10): print $i; $i++; endwhile; ?>
二、do-while語句
do-while 循環(huán)只有一種語法:
<?php $i = 0; do { echo $i; } while ($i > 0); ?>
以上循環(huán)將正好運(yùn)行一次,因為經(jīng)過第一次循環(huán)后,當(dāng)檢查表達(dá)式的真值時,其值為 false($i 不大于 0)而導(dǎo)致循環(huán)終止。
資深的 C 語言用戶可能熟悉另一種不同的 do-while 循環(huán)用法。在這種用法中,將語句放在 do-while(0) 之中,然后在循環(huán)內(nèi)部使用 break 語句來結(jié)束執(zhí)行循環(huán)。以下代碼片段示范了此方法:
<?php do { if ($i < 5) { echo "i is not big enough"; break; } $i *= $factor; if ($i < $minimum_limit) { break; } echo "i is ok"; /* process i */ } while(0); ?>
還可以使用 goto 跳出循環(huán),取代這種 hack 的方式。下面是一個使用 goto 語句跳出循環(huán)的示例:
#include <stdio.h> int main() { int i = 0; while (1) { printf("%d\n", i); i++; if (i > 5) { goto end; // 跳轉(zhuǎn)到標(biāo)簽 end } } end: return 0; }
在這個例子中,當(dāng) i 的值大于 5 時,程序會執(zhí)行 goto 語句,跳轉(zhuǎn)到標(biāo)簽 end。在標(biāo)簽 end 處,程序?qū)⒔Y(jié)束循環(huán)并退出。
三、兩者區(qū)別
do-while 循環(huán)和 while 循環(huán)都屬于循環(huán)結(jié)構(gòu),然而它們在執(zhí)行方式上存在顯著的差異。兩者的主要區(qū)別在于循環(huán)條件的檢查時間點以及循環(huán)體是否一定會被執(zhí)行。
具體來說,while 循環(huán)的特點是先檢查循環(huán)條件是否為真,如果條件為真則執(zhí)行循環(huán)體內(nèi)的語句,然后在每次循環(huán)結(jié)束時再次檢查條件。如果條件仍然為真,則繼續(xù)執(zhí)行循環(huán),否則終止循環(huán)。相反,do-while 循環(huán)會先執(zhí)行一次循環(huán)體內(nèi)的語句,然后再檢查條件。無論條件是否為真,do-while 循環(huán)都將至少執(zhí)行一次循環(huán)體內(nèi)的語句。
總之,與 while 循環(huán)相比,do-while 循環(huán)能夠保證至少執(zhí)行一次循環(huán)體內(nèi)的語句,這是因為它先執(zhí)行語句然后才進(jìn)行條件判斷。而在一般的 while 循環(huán)中,如果一開始就滿足條件判斷為 false,那么整個循環(huán)可能就不會執(zhí)行。