截止到目前,在咱們所看過的程序中,都是從上向下排列,而後由 PHP 執行。若是你想改變這個工做流程,應該怎麼作?你須要程序做出一些判斷,並依據不一樣的狀況去完成不一樣的事情,例如依據天天時間的不一樣打印出 '早上好' 'Good Morning' 或 '晚上好' 'Good Evening'?php
正如你可能已經猜到的那樣,這是經過流程控制來實現的。在 PHP 中有多種流程控制語句。數組
if
語句if
語句用於判斷條件:若是條件爲真(True),咱們將運行一部分代碼,不然咱們將運行另外一部分代碼。其中 else
從句是可選的。bash
示例(保存爲 if.php
)app
<?php
$number = 23;
fwrite(STDOUT, 'Enter an integer: ');
$guess = (int)trim(fgets(STDIN));
if ($guess == $number) {
echo 'Congratulations, you guessed it.' . PHP_EOL;
echo '(but you do not win any prizes!)' . PHP_EOL;
} else if ($guess < $number) {
echo 'No, it is a little higher than that' . PHP_EOL;
} else {
echo 'No, it is a little lower than that' . PHP_EOL;
}
echo 'Done' . PHP_EOL;
複製代碼
輸出:函數
$ php if.php
Enter an integer: 50
No, it is a little lower than that
Done
$ php if.php
Enter an integer: 22
No, it is a little higher than that
Done
$ php if.php
Enter an integer: 23
Congratulations, you guessed it.
(but you do not win any prizes!)
Done
複製代碼
在這個程序中,咱們根據用戶猜想的數字來檢查這一數字是不是咱們所設置的。咱們將變量 $number
設爲任何咱們所但願的整數,例如 23
。而後,咱們經過 fgets()
函數來獲取用戶的猜想數。所謂函數是一種可重複使用的程序。咱們將在下一章詳細討論它。oop
咱們爲內置的 fwrite
函數提供一串打印到屏幕上的字符串並等待用戶的輸入。一旦咱們輸入了某些內容並按下鍵盤上的 enter
鍵,fgets()
函數將以字符串的形式返回咱們所輸入的內容。而後咱們經過 (int)
將這個字符串轉換成一個整數並將其儲存在變量 $guess
中。實際上,大多數狀況下都不須要強制轉換,由於當運算符,函數或流程控制須要一個 integer
參數時,值會自動轉換。ui
接下來,咱們將用戶提供的猜想數與咱們所選擇的數字進行對比。若是它們相等,咱們就打印一條成功信息。在這裏要注意到咱們使用大括號和縮進級別來告訴 PHP 哪些語句分別屬於哪一個塊。spa
而後,咱們檢查猜想數是否小於咱們選擇的數字,若是是,咱們將告訴用戶他們必須猜一個更高一些的數字。在這裏咱們使用的是 elseif
語句,它們實際上將兩個相連的 if else-if else
語句合併成一句 if-elseif-else
語句。這可以使程序更加簡便。指針
你能夠在 if
塊的一個 if
語句中設置另外一個 if
語句,並能夠如此進行下去——這被稱做嵌套的 if
語句。code
要記住 elseif
和 else
部分都是可選的。一個最小規模且有效的 if
語句是這樣的:
<?php
if (True) {
echo 'Yes, it is true' . PHP_EOL;
}
複製代碼
當 PHP 完整執行了 if
語句或其相關的 elseif
else
子句後,它會移動到下一部分的代碼塊。在本例中,也就是 echo 'Done' . PHP_EOL;
語句。在完成這些工做後,PHP 會發現運行至程序末尾並宣告工做的完成。
雖然這是一個很簡單的程序(對於具備 C/C++ 背景的人來講很是簡單易懂),可是最開始你可能須要刻意的去記憶,等到更多的操做以後你就會習慣其中的邏輯,到時候對你來講就是「天然而然」的事情了。
while
語句while
語句可以讓你在條件爲真的前提下重複執行某塊語句。 while
語句是 循環(Looping) 語句的一種。
示例(保存爲 while.php
):
<?php
$number = 23;
$running = True;
while ($running) {
fwrite(STDOUT, 'Enter an integer: ');
$guess = (int)trim(fgets(STDIN));
if ($guess == $number) {
echo 'Congratulations, you guessed it.' . PHP_EOL;
// 使 while 循環終止
$running = False;
} elseif ($guess < $number) {
echo 'No, it is a little higher than that' . PHP_EOL;
} else {
echo 'No, it is a little lower than that' . PHP_EOL;
}
}
// while 循環結束執行
echo 'The while loop is over.' . PHP_EOL;
echo 'Done' . PHP_EOL;
複製代碼
輸出:
$ php while.php
Enter an integer: 50
No, it is a little lower than that
Enter an integer: 22
No, it is a little higher than that
Enter an integer: 23
Congratulations, you guessed it.
The while loop is over.
Done
複製代碼
在這一程序中,咱們依舊經過猜數遊戲來演示,不過新程序的優勢在於可以容許用戶持續猜想直至他猜中爲止,而無需像咱們在上一節中所作的那樣,每次猜想都要從新運行程序。這種變化恰到好處地演示了 while
語句的做用。
首先咱們將 fwrite
與 if
語句移到 while
循環之中,並在 while
循環開始前將變量 $running
設置爲 True
。程序開始時,咱們首先檢查變量 $running
是否爲 True
,以後再執行相應的 while
代碼塊。在這一代碼塊被執行以後,將會從新對條件進行檢查,在本例中也就是 $running
變量。若是它依舊爲 True
,咱們將再次執行 while
代碼塊,不然咱們將結束循環,而後進入到下一個語句中。
True
和 False
被稱做布爾(Boolean)型,你能夠將它們分別等價地視爲 1
與 0
。
do-while
語句do-while
循環和 while
循環很是類似,區別在於表達式的值是在每次循環結束時檢查而不是開始時。和通常的 while
循環主要的區別是 do-while
的循環語句保證會執行一次(表達式的真值在每次循環結束後檢查),然而在通常的 while
循環中就不必定了(表達式真值在循環開始時檢查,若是一開始就爲 FALSE
則整個循環當即終止)。
示例(保存爲 do_while.php
):
<?php
$number = 23;
$running = False;
do {
fwrite(STDOUT, 'Enter an integer: ');
$guess = (int)trim(fgets(STDIN));
if ($guess == $number) {
echo 'Congratulations, you guessed it.' . PHP_EOL;
// 使 while 循環終止
$running = False;
} elseif ($guess < $number) {
echo 'No, it is a little higher than that' . PHP_EOL;
// 使 do-while 循環繼續
$running = True;
} else {
echo 'No, it is a little lower than that' . PHP_EOL;
// 使 do-while 循環繼續
$running = True;
}
} while ($running);
// while 循環結束執行
echo 'The while loop is over.' . PHP_EOL;
echo 'Done' . PHP_EOL;
複製代碼
輸出:
$ php do_while.php
Enter an integer: 50
No, it is a little lower than that
Enter an integer: 22
No, it is a little higher than that
Enter an integer: 23
Congratulations, you guessed it.
The while loop is over.
Done
複製代碼
在這一程序中,咱們依舊經過猜數遊戲來演示,與 while
語句的示例相似,一樣可以容許用戶持續猜想直到猜中爲止,首先咱們將 fwrite
與 if
語句移到 while
循環之中,並在 while
循環開始前將變量 $running
設置爲 False
。程序開始時,不會判斷 $running
是否爲真,而是先執行相應的 while
代碼塊。在這一代碼塊被執行以後,會對條件進行檢查,在本例中也就是 $running
變量。若是它爲 True
,咱們將再次執行 while
代碼塊,不然咱們將結束循環,而後進入到下一個語句中。
for
語句for
循環是 PHP 中最複雜的循環結構。它的行爲和 C 語言的類似。
示例(保存爲 for.php
)
<?php
for ($i = 1; $i <= 5; $i++) {
echo $i . PHP_EOL;
}
echo 'The for loop is over' . PHP_EOL;
複製代碼
輸出:
$ php for.php
1
2
3
4
5
The for loop is over
複製代碼
在這個程序裏,會打印一列數字,在循環開始前表達式 $i = 1;
先無條件求值一次。表達式 $i <= 5;
在每次循環開始前求值一次,若是值爲 True
則繼續循環,執行嵌套的循環語句。若是爲 False
則終止循環。表達式 $i++;
在每次循環以後被求值。其中,每一個表達式均可覺得空或包括逗號分隔的多個表達式。其中第二個表達式若是爲空意味着將無限循環下去(和 C 同樣,PHP 暗中認爲其值爲 True
)。看起來彷佛沒什麼用,其實否則,由於常常會使用有條件的 break
語句來結束循環而不是用 for
的表達式真值判斷。
foreach
語句foreach
語法結構提供了遍歷數組的簡單方式。foreach
僅可以應用於數組和對象,若是嘗試應用於其餘數據類型的變量,或者未初始化的變量將發出錯誤信息。
示例(保存爲 foreach
):
<?php
$arr = array('one', 'two', 'three');
foreach ($arr as $key => $value) {
echo $key . ': ' . $value . PHP_EOL;
}
echo 'The foreach loop is over' . PHP_EOL;
複製代碼
輸出:
$ php foreach.php
0: one
1: two
2: three
The foreach loop is over
複製代碼
在這個程序裏,foreach
會遍歷數組 $arr
,在每次循環中,將每個單元的鍵名賦給變量 $key
,將每個單元的值賦給變量 $value
,而且數組內部的指針向前移一步(所以下一次循環中將會獲得下一個單元)。另外,對於鍵名也能夠不進行賦值。
若是要修改數組的元素能夠經過在 $value
以前加上 &
。此方法將以引用賦值而不是拷貝一個值。須要說明的是,$value
的引用只有在被遍歷的數組能夠引用時纔可用(例如是個變量)。
switch
語句switch
語句相似於具備同一個表達式的一系列 if
語句。不少場合下須要把同一個變量(或表達式)與不少不一樣的值比較,並根據它等於哪一個值來執行不一樣的代碼。這正是 switch
語句的用途。
示例(保存爲 switch.php
):
<?php
fwrite(STDOUT, 'Enter something: ');
$i = trim(fgets(STDIN));
switch ($i) {
case 0:
echo 'i equals 0' . PHP_EOL;
break;
case 1:
echo 'i equals 1' . PHP_EOL;
break;
case 'apple':
echo 'i is apple' . PHP_EOL;
break;
case 'bar':
case 'cake':
echo 'i is bar or cake' . PHP_EOL;
break;
default:
echo 'i is unknown' . PHP_EOL;
}
echo 'The switch loop is over' . PHP_EOL;
複製代碼
輸出:
$ php switch.php
Enter something: 0
i equals 0
The switch loop is over
$ php switch.php
Enter something: 1
i equals 1
The switch loop is over
$ php switch.php
Enter something: apple
i equals 0
The switch loop is over
複製代碼
在這個程序裏,switch
語句一行接一行的執行,當一個 case
語句中的值和 switch
表達式的值匹配時,執行相關代碼,咱們分別輸入了 0
1
apple
,其中須要注意的是,由於 switch/case
採用的是鬆散比較,所以 apple
最早匹配到的是 0
,因此輸出的是 i equals 0
。 匹配之後遇到第一個 break
語句 switch
語句就結束了。
咱們能夠看到 case
表達式能夠是任何求值爲簡單類型的表達式,即整型或浮點數以及字符串。不能用數組或對象,除非它們被解除引用成爲簡單類型。另外,default
是 case
的一個特例,它匹配了任何和其它 case
都不匹配的狀況。
break
語句break
結束當前 for
,foreach
,while
,do-while
或者 switch
結構的執行。break
能夠接受一個可選的數字參數來決定跳出幾重循環。
示例(保存爲 break.php
):
<?php
while (True) {
fwrite(STDOUT, 'Enter something: ');
$s = trim(fgets(STDIN));
if ($s == 'quit') {
break;
}
echo 'Length of the string is ' . strlen($s) . PHP_EOL;
}
echo 'Done' . PHP_EOL;
複製代碼
輸出:
$ php break.php
Enter something: Programming is fun
Length of the string is 18
Enter something: When the work is done
Length of the string is 21
Enter something: if you wanna make your work also fun:
Length of the string is 37
Enter something: use PHP!
Length of the string is 8
Enter something: quit
Done
複製代碼
在這個程序裏,咱們重複地接受用戶的輸入內容並打印出每一次輸入內容的長度。咱們經過檢查用戶輸入的是不是 quit
這一特殊條件來判斷是否應該終止程序。咱們經過中斷循環並轉到程序末尾來結束這一程序。
輸入字符串的長度能夠經過內置的 strlen
函數來獲取到。
continue
語句continue
在循環結構用用來跳過本次循環中剩餘的代碼並在條件求值爲真時開始執行下一次循環。
注意:在 PHP 中 switch 語句被認爲是可使用 continue 的一種循環結構。
continue
接受一個可選的數字參數來決定跳過幾重循環到循環結尾。默認值是 1
,即跳到當前循環末尾。
示例(保存爲 continue.php
):
<?php
while (True) {
fwrite(STDOUT, 'Enter something: ');
$s = trim(fgets(STDIN));
if ($s == 'quit') {
break;
}
if (strlen($s) < 3) {
echo 'Too small' . PHP_EOL;
continue;
}
echo 'Input is of sufficient length' . PHP_EOL;
}
複製代碼
輸出:
$ php continue.php
Enter something: a
Too small
Enter something: 12
Too small
Enter something: abc
Input is of sufficient length
Enter something: quit
複製代碼
在這個程序裏,咱們接受來自用戶的輸入內容,可是隻有在輸入的字符串其長至少 3
字符咱們纔會對其進行處理。爲此,咱們使用內置的 strlen
函數來獲取字符串的長度,若是其長度小於 3
,咱們便使用 continue
語句跳過代碼塊中的其他語句。不然,循環中的剩餘語句將被執行,並在此處進行咱們所但願的任何類型的處理。
咱們已經瞭解了六種流程控制語句——if
,while
,do-while
,for
,foreach
和 switch
——及其相關的 break
與 continue
語句是如何工做的。這些語句是 PHP 中一些最經常使用的部分,所以,習慣去使用它們是必要的。
接下來,咱們將瞭解如何建立並使用函數。
關注公衆號「展白說」,獲取更多有價值的內容。