成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

php易錯筆記-流程控制,函數(shù)

mrcode / 2627人閱讀

摘要:的語法和其它流程控制結構相似部分允許設定代碼段的行為。返回值在失敗時返回并且發(fā)出警告。當一個函數(shù)是有條件被定義時,必須在調(diào)用函數(shù)之前定義。有條件的函數(shù)不能在此處調(diào)用函數(shù),因為它還不存在,但可以調(diào)用函數(shù)。

流程控制
PHP 提供了一些流程控制的替代語法,包括 ifwhile,for,foreachswitch。替代語法的基本形式是把左花括號({)換成冒號(:),把右花括號(})分別換成 endif;,endwhile;,endfor;,endforeach; 以及 endswitch;。
Note: 不支持在同一個控制塊內(nèi)混合使用兩種語法。

特別注意:

switch 和第一個 case 之間的任何輸出(含空格)將導致語法錯誤。例如,這樣是無效的:


    
    ...

而這樣是有效的,因為 switch 之后的換行符被認為是結束標記 ?> 的一部分,所以在 switchcase 之間不能有任何輸出:



    ...

if/else
Note: 必須要注意的是 elseif 與 else if 只有在使用花括號的情況下才認為是完全相同。如果用冒號來定義 if/elseif 條件,那就不能用兩個單詞的 else if,否則 PHP 會產(chǎn)生解析錯誤。
 $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 循環(huán)是 PHP 中最復雜的循環(huán)結構。它的行為和 C 語言的相似。 for 循環(huán)的語法是:

for (expr1; expr2; expr3)
    statement

第一個表達式(expr1)在循環(huán)開始前無條件求值(并執(zhí)行)一次。

expr2每次循環(huán)開始前求值。如果值為 TRUE,則繼續(xù)循環(huán),執(zhí)行嵌套的循環(huán)語句。如果值為 FALSE,則終止循環(huán)。

expr3每次循環(huán)之后被求值(并執(zhí)行)。

每個表達式都可以為空或包括逗號分隔的多個表達式。
表達式 expr2 中,所有用逗號分隔的表達式都會計算,但只取最后一個結果。expr2 為空意味著將無限循環(huán)下去(和 C 一樣,PHP 暗中認為其值為 TRUE)。這可能不像想象中那樣沒有用,因為經(jīng)常會希望用有條件的 break 語句來結束循環(huán)而不是用 for 的表達式真值判斷。

考慮以下的例子,它們都顯示數(shù)字 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 之前加上 & 來修改數(shù)組的元素。此方法將以引用賦值而不是拷貝一個值(最后切記unset()變量,否則可能出現(xiàn)一些意料之外的結果)。

以下的代碼功能完全相同:


";
}

foreach ($arr as $value) {
    echo "Value: $value
"; } ?>

以下代碼功能也完全相同:


";
}

foreach ($arr as $key => $value) {
    echo "Key: $key; Value: $value
"; } ?>
list() 給嵌套的數(shù)組解包

(PHP 5 >= 5.5.0, PHP 7)
PHP 5.5 增添了遍歷一個數(shù)組的數(shù)組的功能并且把嵌套的數(shù)組解包到循環(huán)變量中,只需將 list() 作為值提供。


以上例程會輸出:

A: 1; B: 2
A: 3; B: 4
break

break 結束當前 forforeach,while,do-while 或者 switch 結構的執(zhí)行。

break 可以接受一個可選的數(shù)字參數(shù)來決定跳出幾重循環(huán)。

";
        break 1;  /* 只退出 switch. */
    case 10:
        echo "At 10; quitting
"; break 2; /* 退出 switch 和 while 循環(huán) */ default: break; } } ?>
版本 說明
5.4.0 break 0; 不再合法。這在之前的版本被解析為 break 1;。
5.4.0 取消變量作為參數(shù)傳遞(例如 $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"

continue

continue 在循環(huán)結構用用來跳過本次循環(huán)中剩余的代碼并在條件求值為真時開始執(zhí)行下一次循環(huán)。
Note: 注意在 PHP 中 switch 語句被認為是可以使用 continue 的一種循環(huán)結構。

continue 接受一個可選的數(shù)字參數(shù)來決定跳過幾重循環(huán)到循環(huán)結尾。默認值是 1,即跳到當前循環(huán)末尾。

";
    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 取消變量作為參數(shù)傳遞(例如 $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] one
switch
Note: 注意和其它語言不同,continue 語句作用到 switch 上的作用類似于 break。如果在循環(huán)中有一個 switch 并希望 continue 到外層循環(huán)中的下一輪循環(huán),用 continue 2。

Note: 注意 switch/case 作的是松散比較


declare

(PHP 4, PHP 5, PHP 7)
declare 結構用來設定一段代碼的執(zhí)行指令。declare 的語法和其它流程控制結構相似:

declare (directive)
    statement

directive 部分允許設定 declare 代碼段的行為。目前只認識兩個指令:ticks 以及 encoding(PHP 5.3.0+)。

declare 代碼段中的 statement 部分將被執(zhí)行——怎樣執(zhí)行以及執(zhí)行中有什么副作用出現(xiàn)取決于 directive 中設定的指令。

declare 結構也可用于全局范圍,影響到其后的所有代碼(但如果有 declare 結構的文件被其它文件包含,則對包含它的父文件不起作用)。

Ticks

Tick(時鐘周期)是一個在 declare 代碼段中解釋器每執(zhí)行 N 條可計時的低級語句就會發(fā)生的事件。N 的值是在 declare 中的 directive 部分用 ticks=N 來指定的。

不是所有語句都可計時。通常條件表達式和參數(shù)表達式都不可計時。

在每個 tick 中出現(xiàn)的事件是由 register_tick_function() 來指定的。更多細節(jié)見下面的例子。注意每個 tick 中可以出現(xiàn)多個事件。

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="...") {} 將在與命名空間結合時產(chǎn)生解析錯誤。 在 PHP 5.3 中除非在編譯時指定了
--enable-zend-multibyte,否則 declare 中的 encoding 值會被忽略。

注意除非用 phpinfo(),否則 PHP 不會顯示出是否在編譯時指定了 --enable-zend-multibyte。

參見 zend.script_encoding。

require/include(建議配合魔術常量使用)

requireinclude 幾乎完全一樣,除了處理失敗的方式不同之外。require 在出錯時產(chǎn)生 E_COMPILE_ERROR 級別的錯誤。換句話說將導致腳本中止而 include 只產(chǎn)生警告(E_WARNING),腳本會繼續(xù)運行。

1.被包含文件先按參數(shù)給出的路徑尋找,如果沒有給出目錄(只有文件名)時則按照 include_path 指定的目錄尋找。如果在 include_path 下沒找到該文件則 include 最后才在調(diào)用腳本文件所在的目錄當前工作目錄下尋找。
2.如果定義了路徑——不管是絕對路徑(在 Windows 下以盤符或者 開頭,在 Unix/Linux 下以 / 開頭)還是當前目錄的相對路徑(以 . 或者 .. 開頭)——include_path 都會被完全忽略。例如一個文件以 ../ 開頭,則解析器會在當前目錄的父目錄下尋找該文件。

作用域:

1.當一個文件被包含時,其中所包含的代碼繼承了 include 所在行的變量范圍。從該處開始,調(diào)用文件在該行處可用的任何變量在被調(diào)用的文件中也都可用。
2.不過所有在包含文件中定義的函數(shù)和類都具有全局作用域(引入了一個類stdClass,如果要實例化則使用 new stdClass)。

當一個文件被包含時,語法解析器在目標文件的開頭脫離 PHP 模式并進入 HTML 模式,到文件結尾處恢復。由于此原因,目標文件中需要作為 PHP 代碼執(zhí)行的任何代碼都必須被包括在有效的 PHP 起始和結束標記之中。

返回值:

失敗時 include 返回 FALSE 并且發(fā)出警告。成功的包含則返回 1,除非在包含文件中另外給出了返回值??梢栽诒话ǖ奈募惺褂?return 語句來終止該文件中程序的執(zhí)行并返回調(diào)用它的腳本。同樣也可以從被包含的文件中返回值??梢韵衿胀ê瘮?shù)一樣獲得 include 調(diào)用的返回值。
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
 */
 ?>

函數(shù):

如果在包含文件中定義有函數(shù),這些函數(shù)不管是在 return 之前還是之后定義的,都可以獨立在主文件中使用。如果文件被包含兩次,PHP 5 發(fā)出致命錯誤因為函數(shù)已經(jīng)被定義,但是 PHP 4 不會對在 return 之后定義的函數(shù)報錯。推薦使用 include_once 而不是檢查文件是否已包含并在包含文件中有條件返回。

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

Example #6 使用輸出緩沖來將 PHP 文件包含入一個字符串


Note: 因為是一個語言構造器而不是一個函數(shù),不能被 可變函數(shù)(如:$var()) 調(diào)用。
require_once/include_once

require_once/include_once 語句和 require/include 語句完全相同,唯一區(qū)別是 PHP 會檢查該文件是否已經(jīng)被包含過,如果是則不會再次包含。

實例(php 7.0.12):


goto

goto 操作符可以用來跳轉(zhuǎn)到程序中的另一位置。該目標位置可以用目標名稱加上冒號來標記,而跳轉(zhuǎn)指令是 goto 之后接上目標位置的標記。

PHP 中的 goto 有一定限制,目標位置只能位于同一個文件和作用域,也就是說無法跳出一個函數(shù)或類方法,也無法跳入到另一個函數(shù)。也無法跳入到任何循環(huán)或者 switch 結構中??梢蕴鲅h(huán)或者 switch,通常的用法是用 goto 代替多層的 break

Example #2 goto 跳出循環(huán)示例


以上例程會輸出:

//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.

函數(shù) 用戶自定義函數(shù)
函數(shù)無需在調(diào)用之前被定義,除非是下面兩個例子中函數(shù)是有條件被定義時。

當一個函數(shù)是有條件被定義時,必須在調(diào)用函數(shù)之前定義

Example #2 有條件的函數(shù)


PHP 中的所有函數(shù)和類都具有全局作用域,可以定義在一個函數(shù)之內(nèi)而在之外調(diào)用,反之亦然。

PHP 不支持函數(shù)重載,也不可能取消定義或者重定義已聲明的函數(shù)。


函數(shù)的參數(shù)

PHP 支持按值傳遞參數(shù)(默認),通過引用傳遞參數(shù)以及默認參數(shù)。也支持可變長度參數(shù)列表。

引用傳遞:在函數(shù)定義(而不是使用時)中該參數(shù)的前面加上符號 &function xxx(&$a, $b) {}
默認參數(shù):默認值必須是常量表達式(標量,array,NULL),不能是諸如變量類成員,或者函數(shù)調(diào)用等。
類型聲明(類型提示)
類型聲明允許函數(shù)在調(diào)用時要求參數(shù)為特定類型。 如果給出的值類型不對,那么將會產(chǎn)生一個錯誤: 在PHP 5中,這將是一個可恢復的致命錯誤,而在PHP 7中將會拋出一個TypeError異常。

為了指定一個類型聲明,類型應該加到參數(shù)名前。這個聲明可以通過將參數(shù)的默認值設為NULL來實現(xiàn)允許傳遞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);)。
可變數(shù)量的參數(shù)列表
PHP 在用戶自定義函數(shù)中支持可變數(shù)量的參數(shù)列表。在 PHP 5.6 及以上的版本中,由 ... 語法實現(xiàn)(類似于js);在 PHP 5.5 及更早版本中,使用函數(shù) func_num_args(),func_get_arg(),和 func_get_args() 。

...既可以用于定義可變參數(shù)列表,也可以用來提供參數(shù)解包

Example #13 使用 ... 定義可變參數(shù) in PHP 5.6+


Example #14 使用 ... 提供參數(shù)

Example #15 部分可變參數(shù)以及可變參數(shù)列表的類型提示

$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以及之前版本中使用可變參數(shù)


返回值
如果省略了 return,則返回值為 NULL。

Example #1 return 的使用


從函數(shù)返回一個引用,必須在函數(shù)聲明和指派返回值給一個變量時都使用引用運算符 &

Example #3 從函數(shù)返回一個引用


可變函數(shù)

PHP 支持可變函數(shù)的概念。這意味著如果一個變量名后有圓括號,PHP 將尋找與變量的值同名的函數(shù),并且嘗試執(zhí)行它??勺兒瘮?shù)可以用來實現(xiàn)包括回調(diào)函數(shù),函數(shù)表在內(nèi)的一些用途。

可變函數(shù)不能用于例如 echo,print,unset(),isset()empty(),include,require 以及類似的語言結構。需要使用自己的包裝函數(shù)來將這些結構用作可變函數(shù)。

當調(diào)用靜態(tài)方法時,函數(shù)調(diào)用要比靜態(tài)屬性優(yōu)先

Example #3 Variable 方法和靜態(tài)屬性示例

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


匿名函數(shù)

匿名函數(shù)(Anonymous functions),也叫閉包函數(shù)(closures),允許 臨時創(chuàng)建一個沒有指定名稱的函數(shù)。最經(jīng)常用作回調(diào)函數(shù)(callback)參數(shù)的值。當然,也有其它應用的情況。

匿名函數(shù)目前是通過 Closure 類來實現(xiàn)的。

閉包可以從父作用域中繼承變量。 任何此類變量都應該用 use 語言結構傳遞進去。 PHP 7.1 起,不能傳入此類變量: superglobals、 $this 或者和參數(shù)重名。

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()。
函數(shù)處理 函數(shù)

call_user_func_array — 調(diào)用回調(diào)函數(shù),并把一個數(shù)組參數(shù)作為回調(diào)函數(shù)的參數(shù)

call_user_func — 把第一個參數(shù)作為回調(diào)函數(shù)調(diào)用

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 — 返回參數(shù)列表的某一項

func_get_args — 返回一個包含函數(shù)參數(shù)列表的數(shù)組

func_num_args — Returns the number of arguments passed to the function

function_exists — 如果給定的函數(shù)已經(jīng)被定義就返回 TRUE

get_defined_functions — 返回所有已定義函數(shù)的數(shù)組

register_shutdown_function — 注冊一個會在php中止時執(zhí)行的函數(shù)

register_tick_function — Register a function for execution on each tick

unregister_tick_function — De-register a function for execution on each tick

文章版權歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/28134.html

相關文章

  • php易錯筆記-類與對象,命名空間

    摘要:類與對象基本概念如果在之后跟著的是一個包含有類名的字符串,則該類的一個實例被創(chuàng)建。如果該類屬于一個名字空間,則必須使用其完整名稱。如果一個類被聲明為,則不能被繼承。命名空間通過關鍵字來聲明。 類與對象 基本概念 new:如果在 new 之后跟著的是一個包含有類名的字符串,則該類的一個實例被創(chuàng)建。如果該類屬于一個名字空間,則必須使用其完整名稱。 Example #3 創(chuàng)建一個實例 ...

    MartinHan 評論0 收藏0
  • php易錯筆記-變量,常量,運算符

    摘要:與變量不同,常量不存在可變常量,如果常量名是動態(tài)的,也可以用函數(shù)來獲取常量的值。執(zhí)行運算符命令反引號。遞增遞減運算符不影響布爾值。遞增遞減其他字符變量則無效,原字符串沒有變化。不允許用來檢測常量。 變量 基本 引用賦值 global 關鍵字 以下結果在命令行中有效,網(wǎng)頁php中請不要嘗試。。。都是坑。Example #1 使用 global或$GLOBALS 以下為網(wǎng)頁ph...

    Bamboy 評論0 收藏0
  • php易錯筆記-類型

    摘要:非法下標類型會產(chǎn)生一個級別錯誤。用負數(shù)下標寫入字符串時會產(chǎn)生一個級別錯誤,用負數(shù)下標讀取字符串時返回空字符串。浮點數(shù)也會被轉(zhuǎn)換為整型,意味著其小數(shù)部分會被舍去。 Boolean 當轉(zhuǎn)換為 boolean 時,以下值被認為是 FALSE:布爾值 FALSE 本身整型值 0(零)浮點型值 0.0(零)空字符串,以及字符串 0不包括任何元素的數(shù)組[]特殊類型 NULL(包括尚未賦值的變量)從...

    tinyq 評論0 收藏0
  • PHP小知識點

    摘要:那些瑣碎的知識點作者記錄的的很奇特很難記的知識點。易錯知識點整理注意和的區(qū)別中和都是輸出的作用,但是兩者之間還是有細微的差別。今天手頭不忙,總結一下,分享過程中掌握的知識點。 深入理解 PHP 之:Nginx 與 FPM 的工作機制 這篇文章從 Nginx 與 FPM 的工作機制出發(fā),探討配置背后的原理,讓我們真正理解 Nginx 與 PHP 是如何協(xié)同工作的。 PHP 那些瑣碎的知識...

    hover_lew 評論0 收藏0
  • python 一些易錯點整理

    摘要:與比較中與比較關鍵字用來在函數(shù)或其他局部作用域中使用全局變量。親自動手試后,發(fā)現(xiàn)使用了只會讀閉包內(nèi)的變量,可以隔著多層上一哥們類比看作為步驟 這篇文章是抄抄寫寫得來的,純粹是這個編輯器比筆記的好太多,才在這兒寫。 函數(shù)參數(shù)傳遞 Python的函數(shù)參數(shù)傳遞 對于變量(與對象相對的概念),其實,python函數(shù)參數(shù)傳遞可以理解為就是變量傳值操作,用C++的方式理解,就是對void*賦值。如...

    Lemon_95 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<