PHP學習心得(十)——控制結構

if 結構是不少語言包括 PHP 在內最重要的特性之一,它容許按照條件執行代碼片斷。php

if 語句能夠無限層地嵌套在其它 if 語句中,這給程序的不一樣部分的條件執行提供了充分的彈性。html

else 延伸了 if 語句,能夠在 if 語句中的表達式的值爲 FALSE 時執行語句。express

elseif,在 elseif 的條件表達式值爲 TRUE 時執行語句。數組

在同一個 if 結構中能夠有多個 elseif 語句。第一個表達式值爲 TRUE 的 elseif 語句(若是有的話)將會執行。在 PHP 中,也能夠寫成「else if」(兩個單詞),它和「elseif」(一個單詞)的行爲徹底同樣。句法分析的含義有少量區別(若是你熟悉 C 語言的話,這是一樣的行爲),可是底線是二者會產生徹底同樣的行爲。併發

Note必需要注意的是 elseif 與 else if 只有在相似上例中使用大括號的狀況下才認爲是徹底相同 app

 

PHP 提供了一些流程控制的替代語法,包括 ifwhileforforeach 和 switch。替代語法的基本形式是把左花括號({)換成冒號(:),把右花括號(})分別換成endif;endwhile;endfor;endforeach; 以及 endswitch;。 替代語法一樣能夠用在 else 和 elseif 中。less

while 循環是 PHP 中最簡單的循環類型。
函數

和 if 語句同樣,能夠在 while 循環中用花括號括起一個語句組,或者用替代語法。ui

do-while 和 while 循環很是類似,區別在於表達式的值是在每次循環結束時檢查而不是開始時。this

for 循環是 PHP 中最複雜的循環結構。

每一個表達式均可覺得空或包括逗號分隔的多個表達式。

PHP 4 引入了 foreach 結構,是一種遍歷數組簡便方法。foreach 僅能用於數組。有兩種語法,第二種比較次要但倒是第一種的有用的擴展。

foreach (array_expression as $value)
    statement
foreach (array_expression as $key => $value)
    statement 

第一種格式遍歷給定的 array_expression 數組。每次循環中,當前單元的值被賦給 $value而且數組內部的指針向前移一步(所以下一次循環中將會獲得下一個單元)。

第二種格式作一樣的事,只除了當前單元的鍵名也會在每次循環中被賦給變量 $key

自PHP 5 起,還可能遍歷對象。 

Note:當 foreach 開始執行時,數組內部的指針會自動指向第一個單元。這意味着不須要在foreach 循環以前調用 reset()

自 PHP 5 起,能夠很容易地經過在 $value 以前加上 & 來修改數組的元素。此方法將以引用賦值而不是拷貝一個值。

 <?php
$arr = array(1, 2, 3, 4);
foreach ($arr as &$value) {
    $value = $value * 2;
}
// $arr is now array(2, 4, 6, 8)
?> 

  

break 結束當前 forforeachwhiledo-while 或者 switch 結構的執行。

break 能夠接受一個可選的數字參數來決定跳出幾重循環。

<?php
$arr = array('one', 'two', 'three', 'four', 'stop', 'five');
while (list (, $val) = each($arr)) {
    if ($val == 'stop') {
        break;    /* You could also write 'break 1;' here. */
    }
    echo "$val<br /> ";
}

/* 使用可選參數 */

$i = 0;
while (++$i) {
    switch ($i) {
    case 5:
        echo "At 5<br /> ";
        break 1;  /* 只退出 switch. */
    case 10:
        echo "At 10; quitting<br /> ";
        break 2;  /* 退出 switch 和 while 循環 */
    default:
        break;
    }
}
?>

continue 在循環結構用用來跳過本次循環中剩餘的代碼並在條件求值爲真時開始執行下一次循環

continue 接受一個可選的數字參數來決定跳過幾重循環到循環結尾。

 1 <?php
 2 while (list ($key, $value) = each($arr)) {
 3     if (!($key % 2)) { // skip odd members
 4         continue;
 5     }
 6     do_something_odd($value);
 7 }
 8 
 9 $i = 0;
10 while ($i++ < 5) {
11     echo "Outer<br /> ";
12     while (1) {
13         echo "&nbsp;&nbsp;Middle<br /> ";
14         while (1) {
15             echo "&nbsp;&nbsp;Inner<br /> ";
16             continue 3;
17         }
18         echo "This never gets output.<br /> ";
19     }
20     echo "Neither does this.<br /> ";
21 }
22 ?>

省略 continue 後面的分號會致使混淆。

switch 語句和具備一樣表達式的一系列的 IF 語句類似,即把同一個變量(或表達式)與不少不一樣的值比較,並根據它等於哪一個值來執行不一樣的代碼。

Notecontinue 語句做用到 switch 上的做用相似於 break。若是在循環中有一個 switch 並但願 continue 到外層循環中的下一個輪迴,用 continue 2

理解 switch 是怎樣執行的很是重要。switch 語句一行接一行地執行(其實是語句接語句)。開始時沒有代碼被執行。僅當一個 case 語句中的值和 switch 表達式的值匹配時 PHP 纔開始執行語句,直到 switch 的程序段結束或者遇到第一個 break 語句爲止。若是不在 case 的語句段最後寫上 break 的話,PHP 將繼續執行下一個 case 中的語句段。

在 switch 語句中條件只求值一次並用來和每一個 case 語句比較。在 elseif 語句中條件會再次求值。若是條件比一個簡單的比較要複雜得多或者在一個不少次的循環中,那麼用 switch 語句可能會快一些。

在一個 case 中的語句也能夠爲空,這樣只不過將控制轉移到了下一個 case 中的語句。 

<?php
switch ($i) {
    case 0:
    case 1:
    case 2:
        echo "i is less than 3 but not negative";
        break;
    case 3:
        echo "i is 3";
}
?>

 

一個 case 的特例是 default。它匹配了任何和其它 case 都不匹配的狀況。

case 表達式能夠是任何求值爲簡單類型的表達式,即整型或浮點數以及字符串。不能用數組或對象,除非它們被解除引用成爲簡單類型。

switch 支持替代語法的流程控制。

容許使用分號(;)代替case語句後的冒號(:),

declare 結構用來設定一段代碼的執行指令。declare 的語法和其它流程控制結構類似:

declare (directive)
    statement

directive 部分容許設定 declare 代碼段的行爲。目前只認識兩個指令:ticks 指令以及  encoding指令。

Noteencoding 是 PHP 5.3.0 新增指令。

declare 代碼段中的 statement 部分將被執行——怎樣執行以及執行中有什麼反作用出現取決於 directive 中設定的指令。

declare 結構也可用於全局範圍,影響到其後的全部代碼(但若是有 declare 結構的文件被其它文件包含,它對包含它的文件不起做用)。

<?php

// you can use this:
declare(ticks=1) {
    // entire script here
}

// or you can use this:
declare(ticks=1);
// entire script here
?>

 

Ticks

ticks 指令在 PHP 5.3.0 中是過期指令,將會從 PHP 6.0.0 移除。

Tick 是一個在 declare 代碼段中解釋器每執行 N 條低級語句就會發生的事件。N 的值是在declare 中的 directive 部分用 ticks=N 來指定的。

在每一個 tick 中出現的事件是由 register_tick_function() 來指定的。

Ticks 很適合用來作調試,以及實現簡單的多任務,後臺 I/O 和不少其它任務。

 

 

在一個函數中調用 return() 語句,將當即結束此函數的執行並將它的參數做爲函數的值返回。return() 也會終止 eval() 語句或者腳本文件的執行。

若是在全局範圍中調用,則當前腳本文件停止運行。若是當前腳本文件是被 include() 的或者require() 的,則控制交回調用文件。此外,若是當前腳本是被 include() 的,則 return()的值會被看成 include() 調用的返回值。若是在主腳本文件中調用 return(),則腳本停止運行。若是當前腳本文件是在 php.ini 中的配置選項 auto_prepend_file 或者 auto_append_file 所指定的,則此腳本文件停止運行。

Note注意既然 return() 是語言結構而不是函數,所以其參數沒有必要用括號將其括起來。一般都不用括號,實際上也應該不用,這樣能夠下降 PHP 的負擔。

 

require() 語句包含並運行指定文件,詳見 include() 文檔。

require() 和 include() 幾乎徹底同樣,除了處理失敗的方式不一樣以外。include() 產生一個Warning而 require() 則致使一個 Fatal Error。換句話說,若是想在丟失文件時中止處理頁面,那就別猶豫了,用 require() 吧。include() 就不是這樣,腳本會繼續運行。同時也要確認設置了合適的include_path。

1 <?php
2 
3 require 'prepend.php';
4 
5 require $somefile;
6 
7 require ('somefile.txt');
8 
9 ?>

 

include() 語句包含並運行指定文件。

如下文檔也適用於 require()。這兩種結構除了在如何處理失敗以外徹底同樣。include() 產生一個警告而 require() 則致使一個致命錯誤。換句話說,若是想在遇到丟失文件時中止處理頁面就用 require()include() 就不是這樣,腳本會繼續運行。同時也要確認設置了合適的 include_path。

當一個文件被包含時,其中所包含的代碼繼承了 include 所在行的變量範圍。從該處開始,調用文件在該行處可用的任何變量在被調用的文件中也均可用。不過全部在包含文件中定義的函數和類都具備全局做用域。

 1 vars.php
 2 <?php
 3 
 4 $color = 'green';
 5 $fruit = 'apple';
 6 
 7 ?>
 8 
 9 test.php
10 <?php
11 
12 echo "A $color $fruit"; // A
13 
14 include 'vars.php';
15 
16 echo "A $color $fruit"; // A green apple
17 
18 ?>

 

若是 include 出現於調用文件中的一個函數裏,則被調用的文件中所包含的全部代碼將表現得如同它們是在該函數內部定義的同樣。因此它將遵循該函數的變量範圍。

include() 是一個特殊的語言結構,其參數不須要括號。在比較其返回值時要注意。

比較 include 的返回值

<?php
// won't work, evaluated as include(('vars.php') == 'OK'), i.e. include('')
if (include('vars.php') == 'OK') {
    echo 
'OK';
}

// works
if ((include 'vars.php') == 'OK') {
    echo 
'OK';
}
?>

 

include() 和 return() 語句

return.php
<?php

$var 
'PHP';

return 
$var;

?>

noreturn.php
<?php

$var 
'PHP';

?>

testreturns.php
<?php

$foo 
= include 'return.php';

echo 
$foo// prints 'PHP'

$bar = include 'noreturn.php';

echo 
$bar// prints 1

?>

 

$bar 的值爲 1 是由於 include 成功運行了。注意以上例子中的區別。第一個在被包含的文件中用了 return() 而另外一個沒有。若是文件不能被包含,則返回 FALSE 併發出一個E_WARNING 警告。

若是在包含文件中定義有函數,這些函數能夠獨立因而否在 return() 以前仍是以後在主文件中使用。推薦使用 include_once() 而不是檢查文件是否已包含並在包含文件中有條件返回。

另外一個將 PHP 文件「包含」到一個變量中的方法是用輸出控制函數結合 include() 來捕獲其輸出,例如:

 1 <?php
 2 $string = get_include_contents('somefile.php');
 3 
 4 function get_include_contents($filename) {
 5     if (is_file($filename)) {
 6         ob_start();
 7         include $filename;
 8         $contents = ob_get_contents();
 9         ob_end_clean();
10         return $contents;
11     }
12     return false;
13 }
14 
15 ?>

 

要在腳本中自動包含文件,參見 php.ini 中的 auto_prepend_file 和 auto_append_file 配置選項。

Note由於是一個語言構造器而不是一個函數,不能被 可變函數 調用。

goto操做符能夠用來跳轉到程序中的某一指定位置。該目標位置能夠用目標名稱 加上冒號來標記。PHP中的goto有必定限制,只能在同一個文件和做用域中跳轉, 也就是說你沒法跳出一個函數或類方法,也沒法跳入到另外一個函數。你也沒法跳入到任何循環或者switch 結構中。常見的用法是用來跳出循環或者switch,能夠代替多層的break

1 <?php
2 goto a;
3 echo 'Foo';
4  
5 a:
6 echo 'Bar';
7 ?>
8 
9 以上例程會輸出:Bar
相關文章
相關標籤/搜索