流程控制對于任何一門編程語言來說都是至關(guān)重要的,它提供了控制程序步驟的基本手段,是程序的核心部分??梢哉f,缺少了控制流程,就不會(huì)有程序設(shè)計(jì)語言,因?yàn)楝F(xiàn)在沒有哪一種程序只是線性地執(zhí)行語句序列。程序中需要與用戶相互交流,需要根據(jù)用戶的輸入決定執(zhí)行序列,需要有循環(huán)將代碼反復(fù)執(zhí)行等,這些都少不了流程控制。在任何一門程序設(shè)計(jì)語言中,都需要支持滿足程序結(jié)構(gòu)化所需要的三種基本結(jié)構(gòu):順序結(jié)構(gòu)、分支結(jié)構(gòu)(選擇結(jié)構(gòu)或條件結(jié)構(gòu))和循環(huán)結(jié)構(gòu)。在 PHP 中,為支持這三種結(jié)構(gòu),提供了實(shí)現(xiàn)這三種結(jié)構(gòu)所需的語句。在程序結(jié)構(gòu)中,最基本的就是順序結(jié)構(gòu)。順序結(jié)構(gòu)就是語句按出現(xiàn)的先后次序會(huì)按照自上而下的順序執(zhí)行,在 PHP 的程序設(shè)計(jì)語言中,順序結(jié)構(gòu)的語句主要是賦值語句、輸入/輸出語句等。所以對于順序結(jié)構(gòu)就不必多介紹了。
順序結(jié)構(gòu)的程序雖然能解決計(jì)算、輸出等問題,但不能先做判斷再選擇。對于要先做判斷再選擇的問題就要使用分支結(jié)構(gòu),又稱為選擇結(jié)構(gòu)或條件結(jié)構(gòu)。分支結(jié)構(gòu)的執(zhí)行是依據(jù)一定的條件選擇執(zhí)行路徑,而不是嚴(yán)格按照語句出現(xiàn)的物理順序.分支結(jié)構(gòu)的程序設(shè)計(jì)方法的關(guān)鍵在于構(gòu)造合適的分支條件和分析程序流程,根據(jù)不同的程序流程選擇適當(dāng)?shù)姆种дZ句。分支結(jié)構(gòu)適合于帶有邏輯或關(guān)系比較等條件判斷的計(jì)算。即程序在執(zhí)行過程中依照條件的結(jié)果來改變程序執(zhí)行的順序。滿足條件時(shí)執(zhí)行某一敘述塊,反之則執(zhí)行另一敘述塊。在程序中使用分支結(jié)構(gòu)可以有以下幾種形式;
>單一條件分支結(jié)構(gòu)(if)
>雙向條件分支結(jié)構(gòu)(else從句)
>多向條件分支結(jié)構(gòu)(elseif子句)
>巢狀條件分支結(jié)構(gòu)(switch語句)
以上4種分支結(jié)構(gòu)都是對條件進(jìn)行判斷,根據(jù)判斷結(jié)果,選擇執(zhí)行不同的分支。但是要根據(jù)程序的不同需求和不同時(shí)機(jī),選擇以上不同形式的分支結(jié)構(gòu)使用。每種分支結(jié)構(gòu)都是通過相應(yīng)的 PHP 語句來完成的。
條件語句用于在不同條件下執(zhí)行不同的動(dòng)作。
在 PHP 中,我們可以使用以下條件語句:
- if 語句 - 如果指定條件為真,則執(zhí)行代碼
- if…else 語句 - 如果條件為true,則執(zhí)行代碼;如果條件為 false,則執(zhí)行另一端代碼
- if…elseif….else 語句 - 選擇若干段代碼塊之一來執(zhí)行
- switch 語句 - 語句多個(gè)代碼塊之一來執(zhí)行
if - else條件語句
<?php
function getLevel ($score) {
if ($score >=90) {
return "優(yōu)秀";
} else if ($score >=80) {
return "良好";
} else {
return "一般";
}
}
echo getLevel(91); //輸出"優(yōu)秀"
?>
switch 語句和 elseif 相似,也是一種多向條件分支結(jié)構(gòu),但i f 和 elseif 語句使用布爾表達(dá)式或布爾值作為分支條件來進(jìn)行分支控制;而 switch 語句則用于測試一個(gè)表達(dá)式的值,并根據(jù)測試結(jié)果選擇執(zhí)行相應(yīng)的分支程序,從而實(shí)現(xiàn)分支控制。 switch 語句由一個(gè)控制表達(dá)式和多個(gè) case 標(biāo)簽組成, case 標(biāo)簽后緊跟一個(gè)代碼塊, case 標(biāo)簽作為這個(gè)代碼塊的標(biāo)識(shí)。
switch 語句的語法格式如下:
switch (表達(dá)式) //使用 switch 關(guān)鍵字,對后面小括號(hào)中的表達(dá)式求值
{ // switch 語句必須由花括號(hào)開始
case 值1: //如果表達(dá)式的值和“值!”匹配則執(zhí)行下面的語句塊
語句塊1; //匹配成功則執(zhí)行的語句塊,可以是多條語句
break; //break用于退出 switch 語句
case 值2: //如果表達(dá)式的值和“值2”匹配則執(zhí)行下面的語句塊
語句塊2; //匹配成功則執(zhí)行的語句塊,可以是多條語句
break ; //break 用于退出 switch 語句
…… //case 語句的個(gè)數(shù)沒有規(guī)定,可以無限的增加
case 值 n: //如果表達(dá)式的值和“值”匹配則執(zhí)行下面的語句塊
語句塊 n; //匹配成功則執(zhí)行的語句塊,可以是多條語句
break ; //break 用于退出 switch 語句
default : //它匹配了任何和其他 case 都不匹配的情況,要放在最后一個(gè) ease 之后,可以省略
語句塊n+1; //配成功則執(zhí)行的語句塊,可以是多條語句
} //switch 語句必須由花括號(hào)結(jié)東
這種分支語句的執(zhí)行是先對 switch 后面括號(hào)中的“表達(dá)式”求值,然后依次匹配 case 標(biāo)簽后的值1,值2 …… 值 n 等值,遇到匹配的值即執(zhí)行對應(yīng)的執(zhí)行體:如果所有 case 標(biāo)簽后的值與“表達(dá)式”的值都不相等,則執(zhí)行 default 標(biāo)簽后的代碼塊。在使用 switch 語句時(shí)應(yīng)該注意以下幾點(diǎn)。
(1)和 if 語句不同的是, switch 語句后面的控制表達(dá)式的數(shù)據(jù)類型只能是整型或字符串,不能是 boolean 型。通常這個(gè)控制表達(dá)式是一個(gè)變量名稱,雖然 PHP 是弱類型語言,在 switch 后面控制表達(dá)式的變量可以是任意類型數(shù)據(jù),但為了保證匹配執(zhí)行的準(zhǔn)確性,最好只使用整型或字符串中的一種類型。
(2)和 if 語句不同的是, switch 語句后面的花括號(hào)是必須有的。而 switch 語句中各 case 標(biāo)簽前后代碼塊的開始點(diǎn)和結(jié)束點(diǎn)非常清晰,因此完全沒有必要為 case 后代碼塊加花括號(hào)。
(3) case 語句的個(gè)數(shù)沒有規(guī)定,可以無限增加。但 case 標(biāo)簽和 case 標(biāo)簽后面的值之間應(yīng)有一個(gè)空格,值后面必須有一個(gè)冒號(hào),這是語法的一部分。
(4) switch 匹配完成以后,將依次逐條執(zhí)行匹配的分支模塊中的語句,直到 switch 結(jié)構(gòu)結(jié)束或者遇到了 break 語句才停止執(zhí)行。所以,如果一個(gè)分支語句的后面沒有寫上 break 語句,則程序?qū)⒗^續(xù)執(zhí)行下一個(gè)分支語句的內(nèi)容。
(5)與 if 語句中的 else 類似, switch 語句中 default 標(biāo)簽直接在后面加上一個(gè)冒號(hào),看似沒有條件,其實(shí)是有條件的,條件就是“表達(dá)式”的值不能與前面任何一個(gè) case 標(biāo)簽后的值相等,這時(shí)才處理 defant 分支中的語句。 default 標(biāo)簽和 if 中的 else 子句一樣,它不是 switch 語句中必需的,可以省略。
switch 語句和具有同樣表達(dá)式的一系列的 elseif 語句相似,但用 switch 使程序更清晰,可讀性更強(qiáng)。兩種多路分支結(jié)構(gòu)的使用時(shí)機(jī):如果是通過判斷一個(gè)“表達(dá)式的范圍”進(jìn)行分支處理,就要選擇使用一系列的 elseif 語句,例如上一節(jié)中的分時(shí)問候就是對小時(shí)變量進(jìn)行范圍判斷,而采用的 elseif 語句。但很多場合下需要把同一個(gè)“變量(或表達(dá)式)與很多不同的值比較”,并根據(jù)它等于哪個(gè)值來執(zhí)行不同的代碼,這正是 switch 語句的用途。在 switch 語句中條件只求值一次并用來和每個(gè) case 語句比較。在 elseif 語句中條件會(huì)再次求值。如果條件比一個(gè)簡單的比較要復(fù)雜得多或者在一個(gè)很多次的循環(huán)中,那么用 switch 語句可能會(huì)快一些。
在使用 switch 語句時(shí),還可以在匹配多個(gè)值時(shí)執(zhí)行同一個(gè)語句塊。只要將 case 中的語句設(shè)置為空,最重要的是不要加 break 語句,這樣就將控制轉(zhuǎn)移到了下一個(gè) case 中的語句。例如,當(dāng)和值0、1或2任意一個(gè)匹配上時(shí),都會(huì)執(zhí)行相同的語句塊。如下所示:
<?php
$result = "一般";
function getLevel ($score) {
switch (intval($score/10)) { //intval()可以吧變量轉(zhuǎn)換為int型
case 10:
case 9:
return "優(yōu)秀";
case 8:
$result = "良好";
break;
default :
$result = "一般";
break;
}
return $result;
}
echo $result;
echo getLevel(91);
?>