在PHP中,程式碼通常由上到下一行一行執行的,而流程控制指令則會改變程式執行的順序。
今天要來介紹的流程控制指令主要分為分支和迴圈兩種機制:
分支指的是像if、else、switch等,從字面上解釋就是:若XXX為真,則執行程式碼A;否則執行程式碼B。
而迴圈簡單來說就是在條件符合的情況下,重複執行某段程式碼。常用的loop指令有:while、for、do while等。
大部分的分支和迴圈結構都是由布林值(boolean)判斷式來控制的,也就是true或false。
但在進入流程控制之前,要先分清楚'='、'=='這兩者的差別。
$num = 10; //將$num設為10
$num1 = 10;
$num2 = 9;
則 $num1==$num2
為false。
而在PHP中,'!'是not的意思,若要判斷等號左右兩邊是否"不相等",則會寫成:
$num1 != $num2
舉個簡單的例子:若今天下雨,我們就待在家看電影;若沒下雨,我們就去打球;
我們把今天的天氣當成一個變數的話,那上面這段寫成程式碼就會變成:
$rainny = true;
if($rainny){ //若今天下雨
echo "Let's stay home and watch a movie.\n"; //我們就待在家看電影
}else{ //若沒下雨
echo "Let's go play basketball.\n"; //我們就去打球
}
//Output:Let's stay home and watch a movie.
那麼當$rainny為真時,Output就會是:Let's stay home and watch a movie.
反之,若將$rainny設為false則會執行else底下的程式碼:Let's go play basketball.
非常簡單吧!
而當情況不只為真假兩種,而是有多種可能時,可以用多個else if,或用switch來表達。
假設今天天氣可能會有四種情況:
1.若今天出太陽,我們就去打球
2.若今天下雨,我們就在家看電影
3.若今天是陰天,我們就去逛街
4.若今天下雪,我們就去滑雪
用多個else if表達則是:
if(weather=='sunny'){ //若今天出太陽
echo "Let's go play basketball.\n"; //我們就去打球
}else if(weather=='rainny'){ //若今天下雨
echo "Let's stay home and watch a movie.\n"; //我們就待在家看電影
}else if(weather=='windy'){ //若今天是陰天
echo "Let's go shopping.\n"; //我們就去逛街
}else{ //若今天下雪
echo "Let's go skiing.\n"; //我們就去滑雪
}
不過為了維護程式碼的整潔與可讀性,當碰到多種情況需要做判斷時,建議用switch來表示:
$weather = 'windy';
switch ($weather) {
case 'sunny':
echo "Let's go play basketball.\n";
break;
case 'rainny':
echo "Let's stay home and watch a movie.\n";
break;
case 'windy':
echo "Let's go shopping.\n";
break;
default: //若expression的值未出現在上面的case中,則執行這段程式碼
echo "Let's go skiing.\n";
break;
}
//Output:Let's go shopping.
記得case的下的程式碼最後加上一個break跳出這段程式碼,否則它會繼續執行接下來的所有case。
迴圈顧名思義,就是在符合判斷式的情況下會重複執行指定的程式區塊,一直到條件不符合為止才會跳出迴圈。
若今天要算出20以內有幾個偶數,我們可以這樣寫:
$n = 0; //$n表示偶數個數
for($i=1;$i<21;$i++){ //i從1開始,在還沒超過20之前(小於21以前)都執行一次下面的程式碼,每次循環後都+1
if($i%2 == 0){ //若i是2的倍數(%為取餘數的運算符號)
$n++;
}
}
echo "There are $n evens within 20.\n"; //迴圈結束,顯示出20以內有2的倍數總數
//Output:There are 10 evens within 20.
while的寫法則如下:
$n = 0;
$i = 1;
while($i<21){
if($i%2 == 0){
$n++;
}
$i++; //這行要記得,否則這個while迴圈將會變成無限迴圈
}
echo "There are $n evens within 20.\n";
//Output:There are 10 evens within 20.
執行結果跟上面的for迴圈也會是一樣的。
do while則是會先執行迴圈中的程式,執行完才判斷條件,若符合條件就會再次執行。
$n = 0;
$i = 1;
do{
if($i%2 == 0){
$n++;
}
$i++;
}while($i<21); //這行結尾記得要加上';'
echo "There are $n evens within 20.\n";
//Output:There are 10 evens within 20.
不過一般來說,while和for用法的差別在於,while可以用在當你不確定迴圈會跑幾次的時候,for則無法。
break:跳出流程控制區塊,就如前面在switch所示。
break是直接跳出迴圈區塊,而continue則是不執行接下來在區塊內的程式碼,直接跳回區塊的開頭再執行一次。
例如:
for($i=0;$i<10;$i++){
if($i%2==0){
continue;
}
echo "$i isn't the product of 2\n";
}
/*Output:
1 isn't the product of 2
3 isn't the product of 2
5 isn't the product of 2
7 isn't the product of 2
9 isn't the product of 2 */
當$i為偶數時,則會跳過下面這行echo "$i isn't the product of 2\n";
回到區塊開頭繼續執行。
goto則可以在離開控制區塊後,直接跳到某個標記處開始往下執行,用法如下:
for($i=1;$i<11;$i++){
if($i==3){
goto three;
}
}
one: echo "one ";
two: echo "two ";
three: echo "three ";
four: echo "four ";
five: echo "five ";
//Output:three four five
今天就先到這,下回見!