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

截止到目前,在咱們所看過的程序中,都是從上向下排列,而後由 PHP 執行。若是你想改變這個工做流程,應該怎麼作?你須要程序做出一些判斷,並依據不一樣的狀況去完成不一樣的事情,例如依據天天時間的不一樣打印出 '早上好' 'Good Morning' 或 '晚上好' 'Good Evening'?php

正如你可能已經猜到的那樣,這是經過流程控制來實現的。在 PHP 中有多種流程控制語句。數組

if 語句

if 語句用於判斷條件:若是條件爲真(True),咱們將運行一部分代碼,不然咱們將運行另外一部分代碼。其中 else 從句是可選的。bash

示例(保存爲 if.phpapp

<?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

要記住 elseifelse 部分都是可選的。一個最小規模且有效的 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 語句的做用。

首先咱們將 fwriteif 語句移到 while 循環之中,並在 while 循環開始前將變量 $running 設置爲 True。程序開始時,咱們首先檢查變量 $running 是否爲 True,以後再執行相應的 while 代碼塊。在這一代碼塊被執行以後,將會從新對條件進行檢查,在本例中也就是 $running 變量。若是它依舊爲 True,咱們將再次執行 while 代碼塊,不然咱們將結束循環,而後進入到下一個語句中。

TrueFalse 被稱做布爾(Boolean)型,你能夠將它們分別等價地視爲 10

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 語句的示例相似,一樣可以容許用戶持續猜想直到猜中爲止,首先咱們將 fwriteif 語句移到 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 表達式能夠是任何求值爲簡單類型的表達式,即整型或浮點數以及字符串。不能用數組或對象,除非它們被解除引用成爲簡單類型。另外,defaultcase 的一個特例,它匹配了任何和其它 case 都不匹配的狀況。

break 語句

break 結束當前 forforeachwhiledo-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 語句跳過代碼塊中的其他語句。不然,循環中的剩餘語句將被執行,並在此處進行咱們所但願的任何類型的處理。

總結

咱們已經瞭解了六種流程控制語句——ifwhiledo-whileforforeachswitch ——及其相關的 breakcontinue 語句是如何工做的。這些語句是 PHP 中一些最經常使用的部分,所以,習慣去使用它們是必要的。

接下來,咱們將瞭解如何建立並使用函數。

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

相關文章
相關標籤/搜索