php基礎知識:控制結構_PHP教程

來源:互聯網
上載者:User
php的控制結構,大部分和其他主流語言,如C,Java等相同。

這裡列出一些不同的以及經常被考到的細節:

1>流程式控制制的替代文法(pascal的風格)
主要用在if,while,for,foreach 和 switch語句中。替代文法的基本形式是把左花括弧({)換成冒號(:),把右花括弧(})分別換成 endif;,endwhile;,endfor;,endforeach; 以及 endswitch;。
例(1):
if ($a == 5):
/*dosomething1*/
/*dosomething1*/
endif;
就等同於:
if ($a == 5){
/*dosomething1*/
/*dosomething1*/
}
例(2):
if ($a == 5):
echo "a equals 5";
echo "...";
elseif ($a == 6):
echo "a equals 6";
echo "!!!";
else:
echo "a is neither 5 nor 6";
endif;

2>for語句(經常考,並且徹底的明白也是必要的).
格式:(支援`:`……`endfor;`代替{}的形式)
for (expr1; expr2; expr3)
statement
運行過程:
第一個運算式(expr1)在迴圈開始前無條件求值一次。
expr2 在每次迴圈開始前求值。如果值為 TRUE,則繼續迴圈,執行嵌套的迴圈語句。如果值為 FALSE,則終止迴圈。
expr3 在每次迴圈之後被求值(執行)。
等同的while語句為:
expr1;
while(expr2):
expr3;
endwhile;

3>break的不同。
break的作用是:結束當前 for,foreach,while,do-while 或者 switch 結構的執行。
同時break後面可以跟一個數字來決定跳出幾層迴圈。break 1;為跳出1層迴圈。
我不知道c裡面有沒有,因為我沒有c語言的系統的書。

4>foreach
格式:
a.foreach (array_expression as $value)
statement
b.foreach (array_expression as $key => $value)
statement
說明:
a格式遍曆給定的 array_expression 數組。每次迴圈中,當前單元的值被賦給 $value 並且數組內部的指標向前移一步(因此下一次迴圈中將會得到下一個單元)。
b格式做同樣的事,只除了當前單元的鍵名也會在每次迴圈中被賦給變數 $key。

注意:
a.當 foreach 開始執行時,數組內部的指標會自動指向第一個單元。這意味著不需要在 foreach 迴圈之前調用 reset()。/*reset(array &array):把array的內部指標移動到數組array的第一個單元並傳回值*/
b.除非數組是被引用,foreach 所操作的是指定數組的一個拷貝,而不是該數組本身。因此數組指標不會被 each() 結構改變,對返回的數組單元的修改也不會影響原數組。不過原數組的內部指標的確在處理數組的過程中向前移動了。假定 foreach 迴圈運行到結束,原數組的內部指標將指向數組的結尾。
自 PHP 5 起,可以很容易地通過在 $value 之前加上 & 來修改數組的單元。此方法將以引用賦值而不是拷貝一個值。
例:
$arr = array(1, 2, 3, 4);
foreach ($arr as &$value) {
$value = $value * 2;
}
// $arr is now array(2, 4, 6, 8)
c.foreach 不支援用“@”來抑制錯誤資訊的能力。

使用foreach例子:
$arr = array("one", "two", "three");
reset($arr);
while (list(, $value) = each($arr)) {
echo "Value: $value
\n";
}
foreach ($arr as $value) {
echo "Value: $value
\n";
}

5>continue的不同(我很少用continue)
作用:在迴圈結構用用來跳過本次迴圈中剩餘的代碼並在條件求值為真時開始執行下一次迴圈。
同break一樣,也接受一個數字來決定跳出幾層到迴圈代碼尾部。
註明:continue;和continue 1;一樣,都是跳到本層本次迴圈的末尾。continue 2則跳出本層迴圈到外層的末尾。

6>switch中continue的作用:類似於break(和其他語言不同)。

7>declare
結構用來設定一段代碼的執行指令。declare 的文法和其它流程式控制制結構相似:
declare (directive)
statement
directive 部分允許設定 declare 程式碼片段的行為。目前只認識一個指令:ticks(更多資訊見下面 ticks 指令)。
declare 程式碼片段中的 statement 部分將被執行 怎樣執行以及執行中有什麼副作用出現取決於 directive 中設定的指令。
declare 結構也可用於全域範圍,影響到其後的所有代碼。

主要的例子就是用於Tricks(目前也只有tricks):
例如:
function profile($dump = FALSE)
{
static $profile;
// Return the times stored in profile, then erase it
if ($dump) {
$temp = $profile;
unset($profile);
return ($temp);
}
$profile[] = microtime();
}
// 註冊函數profile為ticks函數
register_tick_function("profile");
// 初始化。
profile();
// 運行一塊代碼,當執行2句(ticks=2)簡單語句時,就調用一次函數profile();
declare(ticks=2) {
for ($x = 1; $x < 50; ++$x) {
echo similar_text(md5($x), md5($x*$x)), "
;";
}
}
// 展示存放在概況儲存區(profile)的資料
print_r(profile (TRUE));

注意:
register_tick_function() should not be used with threaded webserver modules. Ticks are not working in ZTS mode and may crash your webserver.
不能用在多道處理模組(??不明白??什麼是多道處理模組?)的伺服器上,不然會crash。我crash好多次了。鬱悶。

8>require和include
不同點:
include() 產生一個警告而 require() 則導致一個致命錯誤。換句話說,如果想在遇到丟失檔案時停止處理頁面就用 require()。include() 就不是這樣,指令碼會繼續運行。同時也要確認設定了合適的 include_path。注意在 PHP 4.3.5 之前,包含檔案中的語法錯誤不會導致程式停止,但從此版本之後會。

相同點以及用法:
a.變數範圍:
當一個檔案被包含時,其中所包含的代碼繼承了 "包含語句" 所在行的變數範圍。從該處開始,調用檔案在該行處可用的任何變數在被調用的檔案中也都可用。不過所有在包含檔案中定義的函數和類都具有全域範圍。
如果 "包含語句" 出現於調用檔案中的一個函數裡,則被調用的檔案中所包含的所有代碼將表現得如同它們是在該函數內部定義的一樣。所以它將遵循該函數的變數範圍。

b.解析模式
當一個檔案被包含時,文法解析器在目標檔案的開頭脫離 PHP 模式並進入 HTML 模式,到檔案結尾處恢複。由於此原因,目標檔案中應被當作 PHP 代碼執行的任何代碼都必須被包括在有效 PHP 起始和結束標記之中。

c.在條件陳述式中的格式問題
因為 include() 和 require() 是特殊的語言結構,在條件陳述式中使用必須將其放在語句組中(花括弧中)。
因為 include() 是一個特殊的語言結構,其參數不需要括弧。在比較其傳回值時要注意。

d.處理傳回值
可以在被包括的檔案中使用 return() 語句來終止該檔案中程式的執行並返回調用它的指令碼。同樣也可以從被包含的檔案中傳回值。可以像普通函數一樣獲得 include 調用的傳回值。不過這在包含遠程檔案時卻不行,除非遠程檔案的輸出具有合法的 PHP 開始和結束標記(如同任何本地檔案一樣)。可以在標記內定義所需的變數,該變數在檔案被包含的位置之後就可用了。
例子:
return.php
==============
$var = 'PHP';
return $var;

noreturn.php
==============
$var = 'PHP';

testreturns.php
=============================
$foo = include 'return.php';
echo $foo; // prints 'PHP'
$bar = include 'noreturn.php';
echo $bar; // prints 1

e.函數和變數重定義的問題.
為了防止這種現象出現,可以使用include_once或者require_once

f.其它:
在 PHP 4.0.2 之前適用以下規則:require() 總是會嘗試讀取目標檔案,即使它所在的行根本就不會執行。條件陳述式不會影響 require()。不過如果 require() 所在的行沒有執行,則目標檔案中的代碼也不會執行。同樣,迴圈結構也不影響 require() 的行為。儘管目標檔案中包含的代碼仍然是迴圈的主體,但 require() 本身只會運行一次

http://www.bkjia.com/PHPjc/317419.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/317419.htmlTechArticlephp的控制結構,大部分和其他主流語言,如C,Java等相同。 這裡列出一些不同的以及經常被考到的細節: 1流程式控制制的替代文法(pascal的風格) 主...

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.