《簡明 PHP 教程》06 流程控制

截止到目前,在我們所看過的程序中会喝,都是從上向下排列陡叠,然后由 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 語句。

要記住 elseifelse 部分都是可選的黔攒。一個最小規(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 語句的作用。

首先我們將 fwriteif 語句移到 while 循環(huán)之中般码,并在 while 循環(huán)開始前將變量 $running 設置為 True妻率。程序開始時,我們首先檢查變量 $running 是否為 True板祝,之后再執(zhí)行相應的 while 代碼塊宫静。在這一代碼塊被執(zhí)行之后,將會重新對條件進行檢查券时,在本例中也就是 $running 變量孤里。如果它依舊為 True,我們將再次執(zhí)行 while 代碼塊革为,否則我們將結束循環(huán)扭粱,然后進入到下一個語句中舵鳞。

TrueFalse 被稱作布爾(Boolean)型震檩,你可以將它們分別等價地視為 10

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ù)猜測直到猜中為止,首先我們將 fwriteif 語句移到 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 表達式可以是任何求值為簡單類型的表達式擅笔,即整型或浮點數以及字符串。不能用數組或對象屯援,除非它們被解除引用成為簡單類型猛们。另外,defaultcase 的一個特例狞洋,它匹配了任何和其它 case 都不匹配的情況弯淘。

break 語句

break 結束當前 forforeach吉懊,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-whilefor瘾英,foreachswitch ——及其相關的 breakcontinue 語句是如何工作的枣接。這些語句是 PHP 中一些最常用的部分,因此缺谴,習慣去使用它們是必要的月腋。

接下來,我們將了解如何創(chuàng)建并使用函數瓣赂。

關注公眾號「展白說」榆骚,獲取更多有價值的內容。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末煌集,一起剝皮案震驚了整個濱河市妓肢,隨后出現的幾起案子,更是在濱河造成了極大的恐慌苫纤,老刑警劉巖碉钠,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異卷拘,居然都是意外死亡喊废,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門栗弟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來污筷,“玉大人,你說我怎么就攤上這事乍赫“曛” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵雷厂,是天一觀的道長惋增。 經常有香客問我,道長改鲫,這世上最難降的妖魔是什么诈皿? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任林束,我火速辦了婚禮,結果婚禮上稽亏,老公的妹妹穿的比我還像新娘诊县。我一直安慰自己,他們只是感情好措左,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布依痊。 她就那樣靜靜地躺著,像睡著了一般怎披。 火紅的嫁衣襯著肌膚如雪胸嘁。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天凉逛,我揣著相機與錄音性宏,去河邊找鬼。 笑死状飞,一個胖子當著我的面吹牛毫胜,可吹牛的內容都是我干的。 我是一名探鬼主播诬辈,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼酵使,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了焙糟?” 一聲冷哼從身側響起口渔,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎穿撮,沒想到半個月后缺脉,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡悦穿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年攻礼,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片栗柒。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡礁扮,死狀恐怖,靈堂內的尸體忽然破棺而出傍衡,到底是詐尸還是另有隱情深员,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布蛙埂,位于F島的核電站,受9級特大地震影響遮糖,放射性物質發(fā)生泄漏绣的。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望屡江。 院中可真熱鬧芭概,春花似錦、人聲如沸惩嘉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽文黎。三九已至惹苗,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間耸峭,已是汗流浹背桩蓉。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留劳闹,地道東北人院究。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像本涕,于是被迫代替她去往敵國和親业汰。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內容

  • 思考:平常針對業(yè)務需求編寫的代碼通常以行為單位菩颖,那么代碼的執(zhí)行邏輯是什么樣子的呢蔬胯? 引入:正常情況下,代碼就是按照...
    好像在哪見過你丶閱讀 641評論 0 0
  • 在C語言中,五種基本數據類型存儲空間長度的排列順序是: A)char B)char=int<=float C)ch...
    夏天再來閱讀 3,325評論 0 2
  • 一位他、數據類型 在PHP中氛濒,支持8種原始類型,其中包括四種標量類型鹅髓、兩種復合類型和兩種特殊類型舞竿。PHP是一門松散類型...
    大嘴蝸牛閱讀 934評論 4 5
  • Swift 提供了類似 C 語言的流程控制結構,包括可以多次執(zhí)行任務的for和while循環(huán)窿冯,基于特定條件選擇執(zhí)行...
    窮人家的孩紙閱讀 690評論 1 1
  • 所有控制流程語句都具有相同的基本特征:根據一組條件選擇要執(zhí)行的語句骗奖。這些語句分三大類,并通過其主要行為進行描述醒串。選...
    CarlDonitz閱讀 267評論 0 0