- 相關(guān)推薦
PHP常用控制結(jié)構(gòu)
不要嘲笑鐵樹。為了開一次花,它付出了比別的樹種更長久的努力。 以下是小編為大家搜索整理了PHP常用控制結(jié)構(gòu),希望能給大家?guī)韼椭?更多精彩內(nèi)容請(qǐng)及時(shí)關(guān)注我們應(yīng)屆畢業(yè)生考試網(wǎng)!
控制結(jié)構(gòu)
目錄 流程控制的替代語法
任何 PHP 腳本都是由一系列語句構(gòu)成的。一條語句可以是一個(gè)賦值語句,一個(gè)函數(shù)調(diào)用,一個(gè)循環(huán),一個(gè)條件語句或者甚至是一個(gè)什么也不做的語句(空語句)。語句通常以分號(hào)結(jié)束。此外,還可以用花括號(hào)將一組語句封裝成一個(gè)語句組。語句組本身可以當(dāng)作是一行語句。本章講述了各種語句類型。 if
if 結(jié)構(gòu)是很多語言包括 PHP 在內(nèi)最重要的特性之一,它允許按照條件執(zhí)行代碼片段。PHP 的 if 結(jié)構(gòu)和 C 語言相似:
if (expr)
statement
?>
expr 按照布爾求值。如果 expr 的值為 TRUE,PHP 將執(zhí)行 statement,如果值為 FALSE - 將忽略 statement。有關(guān)哪些值被視為 FALSE 的更多信息參見轉(zhuǎn)換為布爾值一節(jié)。
如果 $a 大于 $b,則以下例子將顯示 a is bigger than b:
if ($a > $b)
echo "a is bigger than b";
?>
經(jīng)常需要按照條件執(zhí)行不止一條語句,當(dāng)然并不需要給每條語句都加上一個(gè) if 子句?梢詫⑦@些語句放入語句組中。例如,如果 $a 大于 $b,以下代碼將顯示 a is bigger than b 并且將 $a 的值賦給 $b:
if ($a > $b) {
echo "a is bigger than b";
$b = $a;
}
?>
if 語句可以無限層地嵌套在其它 if 語句中,這給程序的不同部分的條件執(zhí)行提供了充分的彈性。
: 語言參考 : 控制結(jié)構(gòu) else
經(jīng)常需要在滿足某個(gè)條件時(shí)執(zhí)行一條語句,而在不滿足該條件時(shí)執(zhí)行其它語句,這正是 else 的功能。else 延伸了 if 語句,可以在 if 語句中的表達(dá)式的值為 FALSE 時(shí)執(zhí)行語句。例如以下代碼在 $a 大于 $b 時(shí)顯示 a is bigger than b,反之則顯示 a is NOT bigger than b: copy to clipboard
if ($a > $b) {
echo "a is bigger than b";
} else {
echo "a is NOT bigger than b";
}
?>
else 語句僅在 if 以及 elseif(如果有的話)語句中的表達(dá)式的值為 FALSE 時(shí)執(zhí)行(參見 elseif)。
<< 控制結(jié)構(gòu) Main : 語言參考 : 控制結(jié)構(gòu) : else This page online Report a bug elseif >> elseif
elseif,和此名稱暗示的一樣,是 if 和 else 的組合。和 else 一樣,它延伸了 if 語句,可以在原來的 if 表達(dá)式值為 FALSE 時(shí)執(zhí)行不同語句。但是和 else 不一樣的是,它僅在 elseif 的條件表達(dá)式值為 TRUE 時(shí)執(zhí)行語句。例如以下代碼將根據(jù)條件分別顯示 a is bigger than b,a equal to b 或者 a is smaller than b: copy to clipboard
if ($a > $b) {
echo "a is bigger than b";
} elseif ($a == $b) {
echo "a is equal to b";
} else {
echo "a is smaller than b";
}
?>
在同一個(gè) if 結(jié)構(gòu)中可以有多個(gè) elseif 語句。第一個(gè)表達(dá)式值為 TRUE 的 elseif 語句(如果有的話)將會(huì)執(zhí)行。在 PHP 中,也可以寫成“else if”(兩個(gè)單詞),它和“elseif”(一個(gè)單詞)的行為完全一樣。句法分析的含義有少許區(qū)別(如果你熟悉 C 語言的話,這是同樣的行為),但是底線是兩者會(huì)產(chǎn)生完全一樣的行為。
elseif 的語句僅在之前的 if 或 elseif 的表達(dá)式值為 FALSE,而當(dāng)前的 elseif 表達(dá)式值為 TRUE 時(shí)執(zhí)行。
Main : 語言參考 : 控制結(jié)構(gòu) : elseif This page online Report a bug 流程控制的替代語法 >> << else 流程控制的替代語法
PHP 提供了一些流程控制的替代語法,包括 if,while,for,foreach 和 switch。替代語法的基本形式是把左花括號(hào)({)換成冒號(hào)(:),把右花括號(hào)(})分別換成 endif;,endwhile;,endfor;,endforeach; 以及 endswitch;。 copy to clipboard
A is equal to 5
在上面的例子中,HTML 內(nèi)容“A is equal to 5”用替代語法嵌套在 if 語句中。該 HTML 的內(nèi)容僅在 $a 等于 5 時(shí)顯示。
替代語法同樣可以用在 else 和 elseif 中。下面是一個(gè)包括 elseif 和 else 的 if 結(jié)構(gòu)用替代語法格式寫的例子: copy to clipboard
if ($a == 5):
echo "a equals 5";
echo "...";
elseif ($a == 6):
echo "a equals 6";
echo "!!!";
else:
echo "a is neither 5 nor 6";
endif;
?>
更多例子參見 while,for 和 if。
Main : 語言參考 : 控制結(jié)構(gòu) : 流程控制的替代語法 This page online Report a bug << elseif while >> while
while 循環(huán)是 PHP 中最簡(jiǎn)單的循環(huán)類型。它和 C 語言中的 while 表現(xiàn)得一樣。while 語句的基本格式是: copy to clipboard
while (expr)
statement
while 語句的含意很簡(jiǎn)單,它告訴 PHP 只要 while 表達(dá)式的值為 TRUE 就重復(fù)執(zhí)行嵌套中的循環(huán)語句。表達(dá)式的值在每次開始循環(huán)時(shí)檢查,所以即使這個(gè)值在循環(huán)語句中改變了,語句也不會(huì)停止執(zhí)行,直到本次循環(huán)結(jié)束。有時(shí)候如果 while 表達(dá)式的值一開始就是 FALSE,則循環(huán)語句一次都不會(huì)執(zhí)行。
和 if 語句一樣,可以在 while 循環(huán)中用花括號(hào)括起一個(gè)語句組,或者用替代語法: copy to clipboard
while (expr):
statement
...
endwhile;
下面兩個(gè)例子完全一樣,都顯示數(shù)字 1 到 10: copy to clipboard
/* example 1 */
$i = 1;
while ($i <= 10) {
echo $i++; /* the printed value would be
$i before the increment
(post-increment) */
}
/* example 2 */
$i = 1;
while ($i <= 10):
print $i;
$i++;
endwhile;
?>
<< 流程控制的替Main : 語言參考 : 控制結(jié)代語法 構(gòu) : while This page online Report a bug
do-while do-while >>
do-while 和 while 循環(huán)非常相似,區(qū)別在于表達(dá)式的值是在每次循環(huán)結(jié)束時(shí)檢查而不是開始時(shí)。和正規(guī)的 while 循環(huán)主要的區(qū)別是 do-while 的循環(huán)語句保證會(huì)執(zhí)行一次(表達(dá)式的真值在每次循環(huán)結(jié)束后檢查),然而在正規(guī)的 while 循環(huán)中就不一定了(表達(dá)式真值在循環(huán)開始時(shí)檢查,如果一開始就為 FALSE 則整個(gè)循環(huán)立即終止)。
do-while 循環(huán)只有一種語法: copy to clipboard
$i = 0;
do {
echo $i;
} while ($i > 0);
?>
以上循環(huán)將正好運(yùn)行一次,因?yàn)榻?jīng)過第一次循環(huán)后,當(dāng)檢查表達(dá)式的真值時(shí),其值為 FALSE($i 不大于 0)而導(dǎo)致循環(huán)終止。
資深的 C 語言用戶可能熟悉另一種不同的 do-while 循環(huán)用法,把語句放在 do-while(0) 之中,在循環(huán)內(nèi)部用 break 語句來結(jié)束執(zhí)行循環(huán)。以下代碼片段示范了此方法: copy to clipboard
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);
?>
如果還不能立刻理解也不用擔(dān)心。即使不用此“特性”也照樣可以寫出強(qiáng)大的代碼來。
for
copy to clipboard
for (expr1; expr2; expr3)
statement
第一個(gè)表達(dá)式(expr1)在循環(huán)開始前無條件求值一次。
expr2 在每次循環(huán)開始前求值。如果值為 TRUE,則繼續(xù)循環(huán),執(zhí)行嵌套的循環(huán)語句。如果值為 FALSE,則終止循環(huán)。
expr3 在每次循環(huán)之后被求值(執(zhí)行)。
每個(gè)表達(dá)式都可以為空。expr2 為空意味著將無限循環(huán)下去(和 C 一樣,PHP 認(rèn)為其值為 TRUE)。這可能不像想象中那樣沒有用,因?yàn)榻?jīng)常會(huì)希望用 break 語句來結(jié)束循環(huán)而不是用 for 的表達(dá)式真值判斷。
考慮以下的例子,它們都顯示數(shù)字 1 到 10: copy to clipboard
/* example 1 */
for ($i = 1; $i <= 10; $i++) {
echo $i;
}
/* example 2 */
for ($i = 1; ; $i++) {
if ($i > 10) {
break;
}
echo $i;
}
/* example 3 */
$i = 1;
for (;;) {
if ($i > 10) {
break;
}
echo $i;
$i++;
}
/* example 4 */
for ($i = 1; $i <= 10; echo $i, $i++);
?>
當(dāng)然,第一個(gè)例子看上去最正常(或者第四個(gè)),但用戶可能會(huì)發(fā)現(xiàn)在 for 循環(huán)中用空的表達(dá)式在很多場(chǎng)合下會(huì)很方便。
PHP 也支持用冒號(hào)的 for 循環(huán)的替代語法。 copy to clipboard
for (expr1; expr2; expr3):
statement;
...
endfor; << do-while Main : 語言參考 : 控制結(jié)構(gòu) : for This page online Report a bug foreach >> foreach
PHP 4 引入了 foreach 結(jié)構(gòu),和 Perl 以及其他語言很像。這只是一種遍歷數(shù)組簡(jiǎn)便方法。foreach 僅能用于數(shù)組,當(dāng)試圖將其用于其它數(shù)據(jù)類型或者一個(gè)未初始化的變量時(shí)會(huì)產(chǎn)生錯(cuò)誤。有兩種語法,第二種比較次要但卻是第一種的有用的擴(kuò)展。 copy to clipboard
foreach (array_expression as $value)
statement
foreach (array_expression as $key => $value)
statement
第一種格式遍歷給定的 array_expression 數(shù)組。每次循環(huán)中,當(dāng)前單元的值被賦給 $value 并且數(shù)組內(nèi)部的指針向前移一步(因此下一次循環(huán)中將會(huì)得到下一個(gè)單元)。
第二種格式做同樣的事,只除了當(dāng)前單元的鍵名也會(huì)在每次循環(huán)中被賦給變量 $key。
自PHP 5 起,還可能遍歷對(duì)象。
注意:
當(dāng) foreach 開始執(zhí)行時(shí),數(shù)組內(nèi)部的指針會(huì)自動(dòng)指向第一個(gè)單元。這意味著不需要在 foreach 循環(huán)之前調(diào)用 reset()。
注意:
除非數(shù)組是被引用,foreach 所操作的是指定數(shù)組的一個(gè)拷貝,而不是該數(shù)組本身。因此數(shù)組指針不會(huì)被 each() 結(jié)構(gòu)改變,對(duì)返回的數(shù)組單元的修改也不會(huì)影響原數(shù)組。不過原數(shù)組的內(nèi)部指針的確在處理數(shù)組的過程中向前移動(dòng)了。假定 foreach 循環(huán)運(yùn)行到結(jié)束,原數(shù)組的內(nèi)部指針將指向數(shù)組的結(jié)尾。
自 PHP 5 起,可以很容易地通過在 $value 之前加上 & 來修改數(shù)組的單元。此方法將以引用賦值而不是拷貝一個(gè)值。 copy to clipboard
$arr = array(1, 2, 3, 4);
foreach ($arr as &$value) {
$value = $value * 2;
}
// $arr is now array(2, 4, 6, 8)
?>
此方法僅在被遍歷的數(shù)組可以被引用時(shí)才可用(例如是個(gè)變量)。 注意:
foreach 不支持用“@”來抑制錯(cuò)誤信息的能力。
用戶可能注意到了以下的代碼功能完全相同: copy to clipboard
$arr = array("one", "two", "three");
reset($arr);
while (list(, $value) = each($arr)) {
echo "Value: $value
\n";0
}
foreach ($arr as $value) {
echo "Value: $value
\n";
}
?>
以下代碼功能也完全相同: copy to clipboard
$arr = array("one", "two", "three");
reset($arr);
while (list($key, $value) = each($arr)) {
echo "Key: $key; Value: $value
\n";
}
foreach ($arr as $key => $value) {
echo "Key: $key; Value: $value
\n";
}
?>
示范用法的更多例子: copy to clipboard
/* foreach example 1: value only */
$a = array(1, 2, 3, 17);
foreach ($a as $v) {
echo "Current value of \$a: $v.\n";
}
/* foreach example 2: value (with key printed for illustration) */
$a = array(1, 2, 3, 17);
$i = 0; /* for illustrative purposes only */
foreach ($a as $v) {
echo "\$a[$i] => $v.\n";
$i++;
}
/* foreach example 3: key and value */
$a = array(
"one" => 1,
"two" => 2,
"three" => 3,
"seventeen" => 17
);
foreach ($a as $k => $v) {
echo "\$a[$k] => $v.\n";
}
/* foreach example 4: multi-dimensional arrays */
$a = array();
$a[0][0] = "a";
$a[0][1] = "b";
$a[1][0] = "y";
$a[1][1] = "z";
foreach ($a as $v1) {
foreach ($v1 as $v2) {
echo "$v2\n";
}
}
/* foreach example 5: dynamic arrays */
foreach (array(1, 2, 3, 4, 5) as $v) {
echo "$v\n";
}
?>
<< for Main : 語言參考 : 控制結(jié)構(gòu) : foreach This page online Report a bug break >> break
break 結(jié)束當(dāng)前 for,foreach,while,do-while 或者 switch 結(jié)構(gòu)的執(zhí)行。 break 可以接受一個(gè)可選的數(shù)字參數(shù)來決定跳出幾重循環(huán)。 copy to clipboard
$arr = array('one', 'two', 'three', 'four', 'stop', 'five');
while (list (, $val) = each($arr)) {
if ($val == 'stop') {
break; /* You could also write 'break 1;' here. */ }
echo "$val
\n";
}
/* Using the optional argument. */
$i = 0;
while (++$i) {
switch ($i) {
case 5:
echo "At 5
\n";
break 1; /* Exit only the switch. */
case 10:
echo "At 10; quitting
\n";
break 2; /* Exit the switch and the while. */
default:
break;
}
}
?>
<< foreach Main : 語言參考 : 控制結(jié)構(gòu) : break This page online Report a bug continue >> continue
continue 在循環(huán)結(jié)構(gòu)用用來跳過本次循環(huán)中剩余的代碼并在條件求值為真時(shí)開始執(zhí)行下一次循環(huán)。
注意:
注意在 PHP 中 switch 語句被認(rèn)為是可以使用 continue 的一種循環(huán)結(jié)構(gòu)。 continue 接受一個(gè)可選的數(shù)字參數(shù)來決定跳過幾重循環(huán)到循環(huán)結(jié)尾。 copy to clipboard
while (list ($key, $value) = each($arr)) {
if (!($key % 2)) { // skip odd members
continue;
}
do_something_odd($value);
}
$i = 0;
while ($i++ < 5) {
echo "Outer
\n";
while (1) {
echo " Middle
\n";
while (1) {
echo " Inner
\n";
continue 3;
}
echo "This never gets output.
\n";
}
echo "Neither does this.
\n";
}
?>
省略 continue 后面的分號(hào)會(huì)導(dǎo)致混淆。以下例子示意了不應(yīng)該這樣做。 copy to clipboard
for ($i = 0; $i < 5; ++$i) {
if ($i == 2)
continue
print "$i\n";
}
?>
希望得到的結(jié)果是: copy to clipboard
1
3
4
可實(shí)際的輸出是: copy to clipboard
2
因?yàn)?print() 調(diào)用的返回值是 int(1),看上去作為了上述可選的數(shù)字參數(shù)。
<< break Main : 語言參考 : 控制結(jié)構(gòu) : continue This page online Report a bug switch >> switch
switch 語句和具有同樣表達(dá)式的一系列的 IF 語句相似。很多場(chǎng)合下需要把同一個(gè)變量(或表達(dá)式)與很多不同的值比較,并根據(jù)它等于哪個(gè)值來執(zhí)行不同的代碼。這正是 switch 語句的用途。
注意:
注意和其它語言不同,continue 語句作用到 switch 上的作用類似于 break。如果在循環(huán)中有一個(gè) switch 并希望 continue 到外層循環(huán)中的下一個(gè)輪回,用 continue 2。
下面兩個(gè)例子使用兩種不同方法實(shí)現(xiàn)同樣的事,一個(gè)用一系列的 if 語句,另一個(gè)用 switch 語句:
例 7.1. switch 結(jié)構(gòu)
if ($i == 0) {
echo "i equals 0";
} elseif ($i == 1) {
echo "i equals 1";
} elseif ($i == 2) {
echo "i equals 2";
}
switch ($i) {
case 0:
echo "i equals 0";
break;
case 1:
echo "i equals 1";
break;
case 2:
echo "i equals 2";
break;
}
?>
例 7.2. switch 結(jié)構(gòu)可以用字符串
switch ($i) {
case "apple":
echo "i is apple";
break;
case "bar":
echo "i is bar";
break;
case "cake":
echo "i is cake";
break;
}
?>
為避免錯(cuò)誤,理解 switch 是怎樣執(zhí)行的非常重要。switch 語句一行接一行地執(zhí)行(實(shí)際上是語句接語句)。開始時(shí)沒有代碼被執(zhí)行。僅當(dāng)一個(gè) case 語句中的值和 switch 表達(dá)式的值匹配時(shí) PHP 才開始執(zhí)行語句,直到 switch 的程序段結(jié)束或者遇到第一個(gè) break 語句為止。如果不在 case 的語句段最后寫上 break 的話,PHP 將繼續(xù)執(zhí)行下一個(gè) case 中的語句段。例如:
switch ($i) {
case 0:
echo "i equals 0";
case 1:
echo "i equals 1";
case 2:
echo "i equals 2";
}
?>
這里如果 $i 等于 0,PHP 將執(zhí)行所有的 print 語句!如果 $i 等于 1,PHP 將執(zhí)行后面兩條 print 語句。只有當(dāng) $i 等于 2 時(shí),才會(huì)得到“預(yù)期”的結(jié)果――只顯示“i equals 2”。所以,別忘了 break 語句就很重要(即使在某些情況下故意想避免提供它們時(shí))。
【PHP常用控制結(jié)構(gòu)】相關(guān)文章:
PHP開發(fā)CS結(jié)構(gòu)的技巧11-09
PHP知識(shí):條件結(jié)構(gòu)語句12-06
PHP中使用會(huì)話控制11-21
學(xué)習(xí)php編程語言 php常用英語單詞11-17
PHP工程師應(yīng)該掌握的知識(shí)結(jié)構(gòu)03-18
PHP常用MySql操作的方法03-27
PHP常用的文件操作函數(shù)11-26