摘要:的語法和其它流程控制結構相似部分允許設定代碼段的行為。返回值在失敗時返回并且發出警告。當一個函數是有條件被定義時,必須在調用函數之前定義。有條件的函數不能在此處調用函數,因為它還不存在,但可以調用函數。
流程控制
PHP 提供了一些流程控制的替代語法,包括 if,while,for,foreach 和 switch。替代語法的基本形式是把左花括號({)換成冒號(:),把右花括號(})分別換成 endif;,endwhile;,endfor;,endforeach; 以及 endswitch;。
Note: 不支持在同一個控制塊內混合使用兩種語法。
特別注意:
switch 和第一個 case 之間的任何輸出(含空格)將導致語法錯誤。例如,這樣是無效的:
...
而這樣是有效的,因為 switch 之后的換行符被認為是結束標記 ?> 的一部分,所以在 switch 和 case 之間不能有任何輸出:
...if/else
Note: 必須要注意的是 elseif 與 else if 只有在使用花括號的情況下才認為是完全相同。如果用冒號來定義 if/elseif 條件,那就不能用兩個單詞的 else if,否則 PHP 會產生解析錯誤。
$b): echo $a." is greater than ".$b; else if($a == $b): // 將無法編譯 echo "The above line causes a parse error."; endif; /* 正確的使用方法: */ if($a > $b): echo $a." is greater than ".$b; elseif($a == $b): // 注意使用了一個單詞的 elseif echo $a." equals ".$b; else: echo $a." is neither greater than or equal to ".$b; endif; ?>for
for 循環是 PHP 中最復雜的循環結構。它的行為和 C 語言的相似。 for 循環的語法是:
for (expr1; expr2; expr3) statement
第一個表達式(expr1)在循環開始前無條件求值(并執行)一次。
expr2 在每次循環開始前求值。如果值為 TRUE,則繼續循環,執行嵌套的循環語句。如果值為 FALSE,則終止循環。
expr3 在每次循環之后被求值(并執行)。
每個表達式都可以為空或包括逗號分隔的多個表達式。
表達式 expr2 中,所有用逗號分隔的表達式都會計算,但只取最后一個結果。expr2 為空意味著將無限循環下去(和 C 一樣,PHP 暗中認為其值為 TRUE)。這可能不像想象中那樣沒有用,因為經常會希望用有條件的 break 語句來結束循環而不是用 for 的表達式真值判斷。
考慮以下的例子,它們都顯示數字 1 到 10:
/* example 2 */ for ($i = 1; ; $i++) { if ($i > 10) { break; } echo $i; } /* example 3 */ $i = 1; for (;;) { if ($i > 10) { break; } echo $i; $i++; } /* example 4 */ for ($i = 1, $j = 0; $i <= 10; $j += $i, print $i, $i++); /* example */ $people = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; for($i = 0, $size = count($people); $i < $size; ++$i) { print $people[$i]; }
excel中可以使用:
foreach
在 $value 之前加上 & 來修改數組的元素。此方法將以引用賦值而不是拷貝一個值(最后切記unset()變量,否則可能出現一些意料之外的結果)。
以下的代碼功能完全相同:
"; } foreach ($arr as $value) { echo "Value: $value
"; } ?>
以下代碼功能也完全相同:
"; } foreach ($arr as $key => $value) { echo "Key: $key; Value: $value
"; } ?>
用 list() 給嵌套的數組解包
(PHP 5 >= 5.5.0, PHP 7)
PHP 5.5 增添了遍歷一個數組的數組的功能并且把嵌套的數組解包到循環變量中,只需將 list() 作為值提供。
以上例程會輸出:
A: 1; B: 2 A: 3; B: 4break
break 結束當前 for,foreach,while,do-while 或者 switch 結構的執行。
break 可以接受一個可選的數字參數來決定跳出幾重循環。
"; break 1; /* 只退出 switch. */ case 10: echo "At 10; quitting
"; break 2; /* 退出 switch 和 while 循環 */ default: break; } } ?>
版本 | 說明 |
---|---|
5.4.0 | break 0; 不再合法。這在之前的版本被解析為 break 1;。 |
5.4.0 | 取消變量作為參數傳遞(例如 $num = 2; break $num;)。 |
A break statement that is in the outer part of a program (e.g. not in a control loop) will end the script.
will only show "hello"
continuecontinue 在循環結構用用來跳過本次循環中剩余的代碼并在條件求值為真時開始執行下一次循環。
Note: 注意在 PHP 中 switch 語句被認為是可以使用 continue 的一種循環結構。
continue 接受一個可選的數字參數來決定跳過幾重循環到循環結尾。默認值是 1,即跳到當前循環末尾。
"; while (1) { echo "Middle
"; while (1) { echo "Inner
"; continue 3; } echo "This never gets output.
"; } echo "Neither does this.
"; } ?>
版本 | 說明 |
---|---|
5.4.0 | continue 0; 不再合法。這在之前的版本被解析為 continue 1;。 |
5.4.0 | 取消變量作為參數傳遞(例如 $num = 2; continue $num;)。 |
"; } ?> For XXXX I filled in - continue 1//[0] zero <0> [1] one <1> [2] two <2> - continue 2//[0] zero <0> [1] one [2] two <2> - break 1//[0] zero <0> [1] one <1> [2] two <2> - break 2//[0] zero <0> [1] oneswitch
Note: 注意和其它語言不同,continue 語句作用到 switch 上的作用類似于 break。如果在循環中有一個 switch 并希望 continue 到外層循環中的下一輪循環,用 continue 2。Note: 注意 switch/case 作的是松散比較。
declare
(PHP 4, PHP 5, PHP 7)
declare 結構用來設定一段代碼的執行指令。declare 的語法和其它流程控制結構相似:
declare (directive) statement
directive 部分允許設定 declare 代碼段的行為。目前只認識兩個指令:ticks 以及 encoding(PHP 5.3.0+)。
declare 代碼段中的 statement 部分將被執行——怎樣執行以及執行中有什么副作用出現取決于 directive 中設定的指令。
declare 結構也可用于全局范圍,影響到其后的所有代碼(但如果有 declare 結構的文件被其它文件包含,則對包含它的父文件不起作用)。
Ticks
Tick(時鐘周期)是一個在 declare 代碼段中解釋器每執行 N 條可計時的低級語句就會發生的事件。N 的值是在 declare 中的 directive 部分用 ticks=N 來指定的。
不是所有語句都可計時。通常條件表達式和參數表達式都不可計時。
在每個 tick 中出現的事件是由 register_tick_function() 來指定的。更多細節見下面的例子。注意每個 tick 中可以出現多個事件。
Example #1 Tick 的用法示例
0) { $a += 2; print($a); } /* tick_handler() called tick_handler() called tick_handler() called 3tick_handler() called */ ?>
Example #2 Ticks 的用法示例
0) { $a += 2; tick_handler(); print($a); tick_handler(); } tick_handler(); ?>
參見 register_tick_function() 和 unregister_tick_function()。
Encoding
可以用 encoding 指令來對每段腳本指定其編碼方式。
Example #3 對腳本指定編碼方式
當和命名空間結合起來時 declare 的唯一合法語法是 declare(encoding="...");,其中 ... 是編碼的值。而
declare(encoding="...") {} 將在與命名空間結合時產生解析錯誤。 在 PHP 5.3 中除非在編譯時指定了
--enable-zend-multibyte,否則 declare 中的 encoding 值會被忽略。
注意除非用 phpinfo(),否則 PHP 不會顯示出是否在編譯時指定了 --enable-zend-multibyte。
參見 zend.script_encoding。
require/include(建議配合魔術常量使用)require 和 include 幾乎完全一樣,除了處理失敗的方式不同之外。require 在出錯時產生 E_COMPILE_ERROR 級別的錯誤。換句話說將導致腳本中止而 include 只產生警告(E_WARNING),腳本會繼續運行。
1.被包含文件先按參數給出的路徑尋找,如果沒有給出目錄(只有文件名)時則按照 include_path 指定的目錄尋找。如果在 include_path 下沒找到該文件則 include 最后才在調用腳本文件所在的目錄和當前工作目錄下尋找。
2.如果定義了路徑——不管是絕對路徑(在 Windows 下以盤符或者 開頭,在 Unix/Linux 下以 / 開頭)還是當前目錄的相對路徑(以 . 或者 .. 開頭)——include_path 都會被完全忽略。例如一個文件以 ../ 開頭,則解析器會在當前目錄的父目錄下尋找該文件。
作用域:
1.當一個文件被包含時,其中所包含的代碼繼承了 include 所在行的變量范圍。從該處開始,調用文件在該行處可用的任何變量在被調用的文件中也都可用。
2.不過所有在包含文件中定義的函數和類都具有全局作用域(引入了一個類stdClass,如果要實例化則使用 new stdClass)。
當一個文件被包含時,語法解析器在目標文件的開頭脫離 PHP 模式并進入 HTML 模式,到文件結尾處恢復。由于此原因,目標文件中需要作為 PHP 代碼執行的任何代碼都必須被包括在有效的 PHP 起始和結束標記之中。
返回值:
在失敗時 include 返回 FALSE 并且發出警告。成功的包含則返回 1,除非在包含文件中另外給出了返回值。可以在被包括的文件中使用 return 語句來終止該文件中程序的執行并返回調用它的腳本。同樣也可以從被包含的文件中返回值。可以像普通函數一樣獲得 include 調用的返回值。
file.php php.php string(2) "aa" } bool(true) PHP Warning: include(): Filename cannot be empty in D:php est est.php on line 13 Warning: include(): Filename cannot be empty in D:php est est.php on line 13 PHP Warning: include(): Failed opening "" for inclusion (include_path=".;C:phppear") in D:php est est.php on line 13 Warning: include(): Failed opening "" for inclusion (include_path=".;C:phppear") in D:php est est.php on line 13 bool(false) PHP Warning: require(file): failed to open stream: No such file or directory in D:php est est.php on line 14 Warning: require(file): failed to open stream: No such file or directory in D:php est est.php on line 14 PHP Fatal error: require(): Failed opening required "file" (include_path=".;C:phppear") in D:php est est.php on line 14 Fatal error: require(): Failed opening required "file" (include_path=".;C:phppear") in D:php est est.php on line 14 */ ?>
函數:
如果在包含文件中定義有函數,這些函數不管是在 return 之前還是之后定義的,都可以獨立在主文件中使用。如果文件被包含兩次,PHP 5 發出致命錯誤因為函數已經被定義,但是 PHP 4 不會對在 return 之后定義的函數報錯。推薦使用 include_once 而不是檢查文件是否已包含并在包含文件中有條件返回。
另一個將 PHP 文件“包含”到一個變量中的方法是用輸出控制函數結合 include 來捕獲其輸出,例如:
Example #6 使用輸出緩沖來將 PHP 文件包含入一個字符串
Note: 因為是一個語言構造器而不是一個函數,不能被 可變函數(如:$var()) 調用。require_once/include_once
require_once/include_once 語句和 require/include 語句完全相同,唯一區別是 PHP 會檢查該文件是否已經被包含過,如果是則不會再次包含。
實例(php 7.0.12):
goto
goto 操作符可以用來跳轉到程序中的另一位置。該目標位置可以用目標名稱加上冒號來標記,而跳轉指令是 goto 之后接上目標位置的標記。
PHP 中的 goto 有一定限制,目標位置只能位于同一個文件和作用域,也就是說無法跳出一個函數或類方法,也無法跳入到另一個函數。也無法跳入到任何循環或者 switch 結構中。可以跳出循環或者 switch,通常的用法是用 goto 代替多層的 break。
Example #2 goto 跳出循環示例
以上例程會輸出:
//j hit 17
Example #3 以下寫法無效
以上例程會輸出:
Fatal error: "goto" into loop or switch statement is disallowed in script on line 2
特別的例子:
Remember if you are not a fan of wild labels hanging around you are free to use braces in this construct creating a slightly cleaner look. Labels also are always executed and do not need to be called to have their associated code block ran. A purposeless example is below.函數 用戶自定義函數
函數無需在調用之前被定義,除非是下面兩個例子中函數是有條件被定義時。當一個函數是有條件被定義時,必須在調用函數之前定義。
Example #2 有條件的函數
PHP 中的所有函數和類都具有全局作用域,可以定義在一個函數之內而在之外調用,反之亦然。PHP 不支持函數重載,也不可能取消定義或者重定義已聲明的函數。
函數的參數
PHP 支持按值傳遞參數(默認),通過引用傳遞參數以及默認參數。也支持可變長度參數列表。
引用傳遞:在函數定義(而不是使用時)中該參數的前面加上符號 &:function xxx(&$a, $b) {}。
默認參數:默認值必須是常量表達式(標量,array,NULL),不能是諸如變量,類成員,或者函數調用等。
類型聲明(類型提示):
類型聲明允許函數在調用時要求參數為特定類型。 如果給出的值類型不對,那么將會產生一個錯誤: 在PHP 5中,這將是一個可恢復的致命錯誤,而在PHP 7中將會拋出一個TypeError異常。
為了指定一個類型聲明,類型應該加到參數名前。這個聲明可以通過將參數的默認值設為NULL來實現允許傳遞NULL。
Type | Description | Minimum PHP version |
---|---|---|
Class/interface name | The parameter must be an instanceof the given class or interface name. | PHP 5.0.0 |
self | The parameter must be an instanceof the same class as the one the method is defined on. This can only be used on class and instance methods. | PHP 5.0.0 |
array | The parameter must be an array. | PHP 5.1.0 |
callable | The parameter must be a valid callable. | PHP 5.4.0 |
bool | The parameter must be a boolean value. | PHP 7.0.0 |
float | The parameter must be a floating point number. | PHP 7.0.0 |
int | The parameter must be an integer. | PHP 7.0.0 |
string | The parameter must be a string. | PHP 7.0.0 |
注意:類型提示只能是以上表格中的類型(單詞),例如bool不能寫作boolean(boolean會被當作class或interface解析)。
類型提示:
以上例程會輸出:
Fatal error: Uncaught TypeError: Argument 1 passed to test() must be an instance of boolean, boolean given, called in - on line 1 and defined in -:1
嚴格類型:使用 declare 語句和strict_types 聲明來啟用嚴格模式(如declare(strict_types=1);)。
可變數量的參數列表:
PHP 在用戶自定義函數中支持可變數量的參數列表。在 PHP 5.6 及以上的版本中,由 ... 語法實現(類似于js);在 PHP 5.5 及更早版本中,使用函數 func_num_args(),func_get_arg(),和 func_get_args() 。
...既可以用于定義可變參數列表,也可以用來提供參數解包
Example #13 使用 ... 定義可變參數 in PHP 5.6+
Example #14 使用 ... 提供參數
Example #15 部分可變參數以及可變參數列表的類型提示
$unit; } return $time; } $a = new DateInterval("P1D"); $b = new DateInterval("P2D"); echo total_intervals("d", $a, $b)." days";//3 days // This will fail, since null isn"t a DateInterval object. echo total_intervals("d", null); //Catchable fatal error: Argument 2 passed to total_intervals() must be an instance of DateInterval, null given, called in - on line 14 and defined in - on line 2 ?>
在php 5.5以及之前版本中使用可變參數:
返回值
如果省略了 return,則返回值為 NULL。
Example #1 return 的使用
從函數返回一個引用,必須在函數聲明和指派返回值給一個變量時都使用引用運算符 &:
Example #3 從函數返回一個引用
可變函數
PHP 支持可變函數的概念。這意味著如果一個變量名后有圓括號,PHP 將尋找與變量的值同名的函數,并且嘗試執行它。可變函數可以用來實現包括回調函數,函數表在內的一些用途。
可變函數不能用于例如 echo,print,unset(),isset(),empty(),include,require 以及類似的語言結構。需要使用自己的包裝函數來將這些結構用作可變函數。
當調用靜態方法時,函數調用要比靜態屬性優先
Example #3 Variable 方法和靜態屬性示例
Variable() reading $variable in this scope. ?>
As of PHP 5.4.0, you can call any callable stored in a variable.
Example #4 Complex callables
匿名函數
匿名函數(Anonymous functions),也叫閉包函數(closures),允許 臨時創建一個沒有指定名稱的函數。最經常用作回調函數(callback)參數的值。當然,也有其它應用的情況。
匿名函數目前是通過 Closure 類來實現的。
閉包可以從父作用域中繼承變量。 任何此類變量都應該用 use 語言結構傳遞進去。 PHP 7.1 起,不能傳入此類變量: superglobals、 $this 或者和參數重名。
Example #3 從父作用域繼承變量(傳值和傳引用)
閉包中 $this 的綁定:
testing(); $function(); $object->testing2()(); ?>
以上例程會輸出(PHP 5.4+):
object(Test)#1 (0) { } PHP Notice: Undefined variable: this in D:php est est.php on line 13 Notice: Undefined variable: this in D:php est est.php on line 13 NULL
而在PHP 5.3中:
PHP Notice: Undefined variable: this in D:php est est.php on line 7 Notice: Undefined variable: this in D:php est est.php on line 7 NULL PHP Parse error: syntax error, unexpected T_FUNCTION, expecting T_PAAMAYIM_NEKUDOTAYIM in D:php est est.php on line 12 Parse error: syntax error, unexpected T_FUNCTION, expecting T_PAAMAYIM_NEKUDOTAYIM in D:php est est.php on line 12
Note: 可以在閉包中使用 func_num_args(),func_get_arg() 和 func_get_args()。函數處理 函數
call_user_func_array — 調用回調函數,并把一個數組參數作為回調函數的參數
call_user_func — 把第一個參數作為回調函數調用
create_function — Create an anonymous (lambda-style) function
forward_static_call_array — Call a static method and pass the arguments as array
forward_static_call — Call a static method
func_get_arg — 返回參數列表的某一項
func_get_args — 返回一個包含函數參數列表的數組
func_num_args — Returns the number of arguments passed to the function
function_exists — 如果給定的函數已經被定義就返回 TRUE
get_defined_functions — 返回所有已定義函數的數組
register_shutdown_function — 注冊一個會在php中止時執行的函數
register_tick_function — Register a function for execution on each tick
unregister_tick_function — De-register a function for execution on each tick
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/28134.html
摘要:類與對象基本概念如果在之后跟著的是一個包含有類名的字符串,則該類的一個實例被創建。如果該類屬于一個名字空間,則必須使用其完整名稱。如果一個類被聲明為,則不能被繼承。命名空間通過關鍵字來聲明。 類與對象 基本概念 new:如果在 new 之后跟著的是一個包含有類名的字符串,則該類的一個實例被創建。如果該類屬于一個名字空間,則必須使用其完整名稱。 Example #3 創建一個實例 ...
摘要:與變量不同,常量不存在可變常量,如果常量名是動態的,也可以用函數來獲取常量的值。執行運算符命令反引號。遞增遞減運算符不影響布爾值。遞增遞減其他字符變量則無效,原字符串沒有變化。不允許用來檢測常量。 變量 基本 引用賦值 global 關鍵字 以下結果在命令行中有效,網頁php中請不要嘗試。。。都是坑。Example #1 使用 global或$GLOBALS 以下為網頁ph...
摘要:非法下標類型會產生一個級別錯誤。用負數下標寫入字符串時會產生一個級別錯誤,用負數下標讀取字符串時返回空字符串。浮點數也會被轉換為整型,意味著其小數部分會被舍去。 Boolean 當轉換為 boolean 時,以下值被認為是 FALSE:布爾值 FALSE 本身整型值 0(零)浮點型值 0.0(零)空字符串,以及字符串 0不包括任何元素的數組[]特殊類型 NULL(包括尚未賦值的變量)從...
摘要:與比較中與比較關鍵字用來在函數或其他局部作用域中使用全局變量。親自動手試后,發現使用了只會讀閉包內的變量,可以隔著多層上一哥們類比看作為步驟 這篇文章是抄抄寫寫得來的,純粹是這個編輯器比筆記的好太多,才在這兒寫。 函數參數傳遞 Python的函數參數傳遞 對于變量(與對象相對的概念),其實,python函數參數傳遞可以理解為就是變量傳值操作,用C++的方式理解,就是對void*賦值。如...
閱讀 875·2021-11-22 09:34
閱讀 1010·2021-10-08 10:16
閱讀 1821·2021-07-25 21:42
閱讀 1793·2019-08-30 15:53
閱讀 3524·2019-08-30 13:08
閱讀 2183·2019-08-29 17:30
閱讀 3346·2019-08-29 17:22
閱讀 2179·2019-08-29 15:35