截止到目前,在我們所看過的程序中会喝,都是從上向下排列陡叠,然后由 PHP 執(zhí)行。如果你想改變這個工作流程肢执,應該怎么做枉阵?你需要程序作出一些判斷,并依據不同的情況去完成不同的事情预茄,例如依據每天時間的不同打印出 '早上好' 'Good Morning' 或 '晚上好' 'Good Evening'兴溜?
正如你可能已經猜到的那樣,這是通過流程控制來實現的耻陕。在 PHP 中有多種流程控制語句拙徽。
if
語句
if
語句用于判斷條件:如果條件為真(True),我們將運行一部分代碼诗宣,否則我們將運行另一部分代碼膘怕。其中 else
從句是可選的。
示例(保存為 if.php
)
<?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()
函數來獲取用戶的猜測數讳癌。所謂函數是一種可重復使用的程序。我們將在下一章詳細討論它存皂。
我們?yōu)閮戎玫?fwrite
函數提供一串打印到屏幕上的字符串并等待用戶的輸入晌坤。一旦我們輸入了某些內容并按下鍵盤上的 enter
鍵,fgets()
函數將以字符串的形式返回我們所輸入的內容旦袋。然后我們通過 (int)
將這個字符串轉換成一個整數并將其儲存在變量 $guess
中骤菠。實際上,大多數情況下都不需要強制轉換疤孕,因為當運算符商乎,函數或流程控制需要一個 integer
參數時,值會自動轉換祭阀。
接下來鹉戚,我們將用戶提供的猜測數與我們所選擇的數字進行對比。如果它們相等专控,我們就打印一條成功信息抹凳。在這里要注意到我們使用大括號和縮進級別來告訴 PHP 哪些語句分別屬于哪個塊。
然后伦腐,我們檢查猜測數是否小于我們選擇的數字赢底,如果是,我們將告訴用戶他們必須猜一個更高一些的數字柏蘑。在這里我們使用的是 elseif
語句幸冻,它們實際上將兩個相連的 if else-if else
語句合并成一句 if-elseif-else
語句。這能夠使程序更加簡便咳焚。
你可以在 if
塊的一個 if
語句中設置另一個 if
語句洽损,并可以如此進行下去——這被稱作嵌套的 if
語句。
要記住 elseif
和 else
部分都是可選的黔攒。一個最小規(guī)模且有效的 if
語句是這樣的:
<?php
if (True) {
echo 'Yes, it is true' . PHP_EOL;
}
當 PHP 完整執(zhí)行了 if
語句或其相關的 elseif
else
子句后趁啸,它會移動到下一部分的代碼塊。在本例中督惰,也就是 echo 'Done' . PHP_EOL;
語句不傅。在完成這些工作后,PHP 會發(fā)現運行至程序末尾并宣告工作的完成赏胚。
雖然這是一個很簡單的程序(對于具有 C/C++ 背景的人來說非常簡單易懂)访娶,但是最開始你可能需要刻意的去記憶,等到更多的操作之后你就會習慣其中的邏輯觉阅,到時候對你來說就是“自然而然”的事情了崖疤。
while
語句
while
語句能夠讓你在條件為真的前提下重復執(zhí)行某塊語句秘车。 while
語句是 循環(huán)(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 循環(huán)終止
$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 循環(huán)結束執(zhí)行
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
它是如何工作的
在這一程序中劫哼,我們依舊通過猜數游戲來演示叮趴,不過新程序的優(yōu)點在于能夠允許用戶持續(xù)猜測直至他猜中為止,而無需像我們在上一節(jié)中所做的那樣权烧,每次猜測都要重新運行程序眯亦。這種變化恰到好處地演示了 while
語句的作用。
首先我們將 fwrite
與 if
語句移到 while
循環(huán)之中般码,并在 while
循環(huán)開始前將變量 $running
設置為 True
妻率。程序開始時,我們首先檢查變量 $running
是否為 True
板祝,之后再執(zhí)行相應的 while
代碼塊宫静。在這一代碼塊被執(zhí)行之后,將會重新對條件進行檢查券时,在本例中也就是 $running
變量孤里。如果它依舊為 True
,我們將再次執(zhí)行 while
代碼塊革为,否則我們將結束循環(huán)扭粱,然后進入到下一個語句中舵鳞。
True
和 False
被稱作布爾(Boolean)型震檩,你可以將它們分別等價地視為 1
與 0
。
do-while
語句
do-while
循環(huán)和 while
循環(huán)非常相似蜓堕,區(qū)別在于表達式的值是在每次循環(huán)結束時檢查而不是開始時抛虏。和一般的 while
循環(huán)主要的區(qū)別是 do-while
的循環(huán)語句保證會執(zhí)行一次(表達式的真值在每次循環(huán)結束后檢查),然而在一般的 while
循環(huán)中就不一定了(表達式真值在循環(huán)開始時檢查套才,如果一開始就為 FALSE
則整個循環(huán)立即終止)迂猴。
示例(保存為 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 循環(huán)終止
$running = False;
} elseif ($guess < $number) {
echo 'No, it is a little higher than that' . PHP_EOL;
// 使 do-while 循環(huán)繼續(xù)
$running = True;
} else {
echo 'No, it is a little lower than that' . PHP_EOL;
// 使 do-while 循環(huán)繼續(xù)
$running = True;
}
} while ($running);
// while 循環(huán)結束執(zhí)行
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
語句的示例類似沸毁,同樣能夠允許用戶持續(xù)猜測直到猜中為止,首先我們將 fwrite
與 if
語句移到 while
循環(huán)之中傻寂,并在 while
循環(huán)開始前將變量 $running
設置為 False
息尺。程序開始時,不會判斷 $running
是否為真疾掰,而是先執(zhí)行相應的 while
代碼塊搂誉。在這一代碼塊被執(zhí)行之后,會對條件進行檢查静檬,在本例中也就是 $running
變量炭懊。如果它為 True
并级,我們將再次執(zhí)行 while
代碼塊,否則我們將結束循環(huán)侮腹,然后進入到下一個語句中嘲碧。
for
語句
for
循環(huán)是 PHP 中最復雜的循環(huán)結構。它的行為和 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
它是如何工作的
在這個程序里呀潭,會打印一列數字,在循環(huán)開始前表達式 $i = 1;
先無條件求值一次至非。表達式 $i <= 5;
在每次循環(huán)開始前求值一次钠署,如果值為 True
則繼續(xù)循環(huán),執(zhí)行嵌套的循環(huán)語句荒椭。如果為 False
則終止循環(huán)谐鼎。表達式 $i++;
在每次循環(huán)之后被求值。其中趣惠,每個表達式都可以為空或包括逗號分隔的多個表達式狸棍。其中第二個表達式如果為空意味著將無限循環(huán)下去(和 C 一樣,PHP 暗中認為其值為 True
)味悄〔莞辏看起來似乎沒什么用,其實不然侍瑟,因為經常會使用有條件的 break
語句來結束循環(huán)而不是用 for
的表達式真值判斷唐片。
foreach
語句
foreach
語法結構提供了遍歷數組的簡單方式。foreach
僅能夠應用于數組和對象涨颜,如果嘗試應用于其他數據類型的變量费韭,或者未初始化的變量將發(fā)出錯誤信息。
示例(保存為 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
星持,在每次循環(huán)中,將每一個單元的鍵名賦給變量 $key
弹灭,將每一個單元的值賦給變量 $value
督暂,并且數組內部的指針向前移一步(因此下一次循環(huán)中將會得到下一個單元)。另外穷吮,對于鍵名也可以不進行賦值逻翁。
如果要修改數組的元素可以通過在 $value
之前加上 &
。此方法將以引用賦值而不是拷貝一個值酒来。需要說明的是卢未,$value
的引用只有在被遍歷的數組可以引用時才可用(例如是個變量)。
switch
語句
switch
語句類似于具有同一個表達式的一系列 if
語句。很多場合下需要把同一個變量(或表達式)與很多不同的值比較辽社,并根據它等于哪個值來執(zhí)行不同的代碼伟墙。這正是 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
語句一行接一行的執(zhí)行戳葵,當一個 case
語句中的值和 switch
表達式的值匹配時,執(zhí)行相關代碼汉匙,我們分別輸入了 0
1
apple
拱烁,其中需要注意的是,因為 switch/case
采用的是松散比較噩翠,因此 apple
最先匹配到的是 0
戏自,所以輸出的是 i equals 0
。 匹配以后遇到第一個 break
語句 switch
語句就結束了伤锚。
我們可以看到 case
表達式可以是任何求值為簡單類型的表達式擅笔,即整型或浮點數以及字符串。不能用數組或對象屯援,除非它們被解除引用成為簡單類型猛们。另外,default
是 case
的一個特例狞洋,它匹配了任何和其它 case
都不匹配的情況弯淘。
break
語句
break
結束當前 for
,foreach
吉懊,while
庐橙,do-while
或者 switch
結構的執(zhí)行。break
可以接受一個可選的數字參數來決定跳出幾重循環(huán)惕它。
示例(保存為 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
這一特殊條件來判斷是否應該終止程序淹魄。我們通過中斷循環(huán)并轉到程序末尾來結束這一程序。
輸入字符串的長度可以通過內置的 strlen
函數來獲取到堡距。
continue
語句
continue
在循環(huán)結構用用來跳過本次循環(huán)中剩余的代碼并在條件求值為真時開始執(zhí)行下一次循環(huán)甲锡。
注意:在 PHP 中 switch 語句被認為是可以使用 continue 的一種循環(huán)結構。
continue
接受一個可選的數字參數來決定跳過幾重循環(huán)到循環(huán)結尾羽戒。默認值是 1
缤沦,即跳到當前循環(huán)末尾。
示例(保存為 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
語句跳過代碼塊中的其余語句。否則届巩,循環(huán)中的剩余語句將被執(zhí)行硅瞧,并在此處進行我們所希望的任何類型的處理。
總結
我們已經了解了六種流程控制語句——if
恕汇,while
腕唧,do-while
,for
瘾英,foreach
和 switch
——及其相關的 break
與 continue
語句是如何工作的枣接。這些語句是 PHP 中一些最常用的部分,因此缺谴,習慣去使用它們是必要的月腋。
接下來,我們將了解如何創(chuàng)建并使用函數瓣赂。
關注公眾號「展白說」榆骚,獲取更多有價值的內容。