流程控制 - PHP手册笔记
腳本由語句構成,語句靠流程控制實現功能,這一節主要介紹了幾個關鍵字的使用。
elseif
elseif和else if的行為完全一樣,如果用冒號來定義if/elseif條件,那就不能用兩個單詞的else if,否則PHP會產生解析錯誤。
<?php $a = 1; $b = 2; if($a > $b) :echo "$a is greater than $b"; elseif($a == $b) :echo "$a equals $b"; else :echo "$a is neither greater than or equal to $b"; endif;替代語法
下面的這些關鍵字可以使用流程控制的替代語法,基本形式是把左花括號換成冒號,右花括號換為下面的字符。
if - endif while - endwhile for - endfor foreach - endforeach switch - endswitch注意!PHP不支持在同一控制塊內混合使用兩種語法。
do-while
這個循環乍看起來挺熟悉的,但是卻忽略了它的某些用法。
手冊中說,資深的C語言用戶可能熟悉另一種不同的do-while循環用法,把語句放在do-while(0)之中。我竟然第一次聽說有這種技巧,看來我還是C語言小白。
順便搜索整理一下do-while(0)這種特殊用法的好處吧。
這個帖子講的挺好的,do{}while(0) 的作用 - c++ - SegmentFault。
foreach
foreach僅能夠應用于數組和對象的遍歷。foreach語法結構提供了遍歷數組的簡單方式,有下面兩種語法。
foreach(array_expression as $value)statement foreach(array_expression as $key => $value)statement要修改數組元素的值需要使用引用賦值,通過在$value前加&實現。
<?php $arr = array(1, 2, 3, 4); foreach($arr as &$value) {$value = $value * 2; } unset($value); foreach($arr as $value) {echo "$value "; // 2 4 6 8 }注意!數組最后一個元素的$value引用在foreach循環之后仍會保留,建議使用unset()將其銷毀。
list-each
在示例程序中,還發現了一種特殊的遍歷方法,姑且稱作list-each。
當foreach開始執行時,數組內部的指針會自動指向第一個單元,因此不需要在foreach循環之前調用reset()。但是對于while中的list-each,數組內部指針$arr會一直存在著,因此在下次循環前需要reset($arr)。
<?php $arr = array('one', 'two', 'three'); // reset($arr); while(list($key, $value) = each($arr)) {echo "Key: $key; Value: $value "; } reset($arr); while(list($key, $value) = each($arr)) {echo "Key: $key; Value: $value "; }在上面這段代碼中,第一個reset可以省略,但第二個reset不能省。
list
PHP 5.5增添了遍歷一個數組的數組的功能,并且把嵌套的數組解包到循環變量中。
<?php $array = [[1, 2],[3, 4], ]; foreach($array as list($a, $b)) {echo "A: $a; B: $b"; }list()中的單元可以少于嵌套數組的,此時多出來的數組單元將被忽略。若多于,將發出錯誤信息。
break
break用來結束當前for/foreach/while/do-while/switch結構的執行。break可以接受一個可選的數字參數來決定跳出幾重循環,但參數不能為變量。
break跳出多重循環還是第一次遇到,特意寫了個小程序嘗試了一下。
<?php while(1) {while(1) {echo 'hello ';break 2;} } echo 'world';特地在C語言里嘗試了一下,提示語法錯誤。
continue
與break相似,continue也可以接受一個可選的數字參數來決定跳過幾重循環到循環結尾。
注意!在PHP中switch語句被認為是可以使用continue的一種循環結構。
switch
手冊中說,PHP和其它語言不同,continue語句作用到switch上的作用類似于break。這是什么意思呢?
switch/case做的是松散比較==,而不是嚴格比較===。效率方面,switch語句中條件只求值一次并用來和每個case語句比較。case表達式可以是任何求值為簡單類型的表達式,不能用數組或對象。允許使用分號代替case語句后的冒號。
declare
declare結構用來設定一段代碼的執行指令,語法結構如下:
declare(directive)statementdirective部分允許設定declare代碼段的行為,目前只認識兩個命令:ticks和encoding。declare結構也可用于全局范圍,影響到期后的所有代碼。但如果有declare結構的文件被其它文件包含,則對包含它的父文件不起作用。
Tick(時鐘周期)是一個在declare代碼段中解釋器每執行N條可計時的低級語句就會發生的事件。在每個tick中出現的事件由register_tick_function()來指定。用法大致如下。
declare(ticks = 1); function tick_handler() {echo "tick_hander() called.\n"; } register_tick_function('tick_hander');可計時的低級語句有很多,register_tick_function()后會調用一次周期事件,每條語句后會調用一次周期事件,花括號結束時會調用一次周期事件。
注意,PHP中表達式不能用逗號隔開,不然會出現語法錯誤。這點與C語言不同,剛注意到。
可以用encoding指令來對每段腳本指定其編碼方式。用法如下:
declare(encoding = 'ISO-8859-1);return
如果是在全局范圍中調用,則當前腳本文件中止運行。如果當前腳本文件是被include或者require,則控制交回調用文件。如果當前腳本時被include的,則return的值會被當作include調用的返回值,那require呢?
require
require和include幾乎完全一樣,除了處理失敗的方式不同之外。
require在出錯時產生E_COMPILE_ERROR級別的錯誤,腳本中止。而include只產生警告E_WARNING,腳本繼續執行。
include
include語句包含并運行指定文件,這里要注意一下指定文件的尋找次序。
- 被包含文件先按參數給出的路徑尋找。如果定義了路徑,include_path會被完全忽略。
- 如果沒有給出目錄(只有文件名)時則按照include_path指定的目錄尋找。若沒找到才在調用腳本文件所在目錄和當前工作目錄下尋找。那么問題來了,調用腳本文件所在目錄和當前工作目錄有什么區別呢?
- 如果最后仍未找到文件,則include結構會發出一條警告,require結構會發出一個致命錯誤。
當一個文件被包含時,其中包含的代碼繼承了include所在行的變量范圍。從該處開始,被調用文件中定義的變量才可在調用文件中使用。當一個文件被包含時,語法解析器在目標文件的開頭脫離PHP模式并進入HTML模式,當文件結尾回復。
對于返回值,在失敗時include返回FALSE并且發出警告。成功的包含則返回1,除非在包含文件中另外給出了返回值。如果在包含文件中定義有函數,這些函數不管是在return之前還是之后定義的,都可以獨立在主文件中使用。
如果來自遠程服務器的文件應該在遠端運行而只輸出結果,那用readfile()函數更好。另一種將PHP文件包含到一個變量中的方法是用輸出控制函數結合include來捕獲其輸出。第一次遇到,比較陌生。下面這段代碼能將腳本vars.php中返回的內容輸出。
<?php $string = get_include_contents('vars.php'); function get_include_contents($filename) {if(is_file($filename)) {ob_start();include $filename;$contents = ob_get_contents();ob_end_clean();return $contents;}return false; } echo $string;因為include和require是一種特殊的語言結構,其參數不需要括號。如果文件被包含兩次,PHP會發出致命錯誤,因為函數已經被定義。推薦使用include_once。
require_once
require_once語句和require語句完全相同,唯一區別是,PHP會檢查該文件是否已經被包含過,如果是則不會再次包含。
include_once
include_once語句和include語句類似,唯一區別是如果該文件已經被包含過,則不會再次包含。
goto
goto操作符用于跳轉到程序的另一位置,目標位置可以用目標名稱加上冒號來標記。PHP中的goto有一定限制,目標位置只能位于同一個文件和作用域。也就是說無法跳出一個函數或類方法,也無法跳入到任何循環或者switch結構。
(全文完)
posted on 2015-06-19 11:27 NET未來之路 閱讀(...) 評論(...) 編輯 收藏轉載于:https://www.cnblogs.com/lonelyxmas/p/4588145.html
總結
以上是生活随笔為你收集整理的流程控制 - PHP手册笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Basic Sorting Algori
- 下一篇: Mybatis各种模糊查询