您好,登錄后才能下訂單哦!
PHP函數介紹
基本使用:
函數定義形式:
function 函數名(形參1,形參2,...) {
//函數體(代碼塊);
}
函數調用形式:
本質上就是使用一個名字來達到執行其中函數中的的作用。通常可以分兩種情形的調用:
第一種:沒有返回值的函數,則調用語句是獨立語句
函數名(實參1,實參2,...); //實參個數應該跟形參有匹配性
第二種:有返回值的函數,則調用語句,通常會“混雜”在別的語句中,并將該調用語句當作一個“數據”來使用:
A: $v1 = 函數名(); //賦值給其它變量,這里省略實參語法,下同
B: $v1 = 函數名()*3+6; //參與運算,然后再賦值
C: echo 函數名(); //直接輸出
D: echo 函數名()*3+6; //參與運算,然后再輸出
E: $v1 = 函數名2(函數名(),實參2,實參3,...); //當作實參使用
函數調用流程分析:
開始調用:實際參數傳數據給形式參數
程序執行流程進入到函數中(一個獨立的運行空間),跟全局執行空間是隔離的
按常規的程序邏輯執行函數中的代碼
如果碰到return語句,則終止函數的執行,跳回函數開始調用的位置
如果執行到函數的最后位置,也同樣跳回函數開始調用的位置
其運行流程原理圖如下:
函數參數問題:
一個函數,
在定義時,有形式參數(形參:parameter)
1:形參一定是一個變量名,
2:該變量名只能是在該函數中有效的變量名,
3:而且只在該函數調用并執行時有效,函數結束,通常這些變量也就“銷毀”
在調用時有實際參數(實參:argument)
實參就是一個“實際數據”,該數據可以是一個“直接數據”(比如5,"abc"),也可以是一個變量中存儲的數據。
實參的作用是將其數據”賦值給“形參變量
實參跟形參之間通常應該有個“一一對應”關系
默認值參數:
定義一個函數的時候,在形式參數的位置,可以給形式參數設定默認值,此時就可以稱為默認值參數。比如:
注意:
默認值不能是對象或資源類型
默認值只能是常量表達式,或常量,不能是變量
即:如下語法是正確的:function f1($v = 3) {}, function f1($v = __LINE__) {},
如下語法是錯誤的:function f1($v = 3+1) {} , $m = 3,function f1($v = $m) {},
函數的參數傳值問題:
實際上,函數的參數傳值問題,跟變量之間的傳值是一樣的規則(模式):默認是值傳遞。
如果實參本身就是“直接數據”,則不存在傳值問題,而是簡單的“賦值”
傳值問題只發生在實參是變量的情形:
我們也可以讓某個參數(形參)以引用傳遞的方式來傳值:
引用傳遞的形參(實參),在函數內部改變其值,在函數外面的實參,也會相應做修改
注意:如果某個形參設定為引用傳遞,此時,實參只能使用變量,否則會出現語法錯誤,如:
參數的數量問題:
1:函數的參數的數量可以是0個或多個 -- 具體多少個,不是語法問題,而是應用問題
2:通常,實際參數的數量應該跟形式參數的數量一致
3:但是,在第二條的基礎上,如果形式參數中有默認值,則實際參數的對應項可以少省略
即:實參的個數,至少應該不少于形參中的非默認值參數的個數
但:我們還有一種特殊的處理函數參數的用法:自由參數數量
定義時可以不給定形參,但調用時,卻又可以給定任何個數的實參
在系統中,var_dump()這個函數也有同樣的使用效果:
$var_dump($v1);
var_dum($v1,$v2,$v3); //這樣也是可以的
這種應用的實現,是依賴于系統中的3個系統函數來達到的:
func_get_args(); //獲得一個函數的接收到的所有實參數據,并結果是一個數組
func_get_arg(n); //獲得一個函數所接收到的第n個實參數據(n從0開始)
func_num_args(); //獲得一個函數所接收到的所有實參數據個數
函數的返回值:
通常來說,一個函數中使用reture語句,并其后帶一個數據(直接數據,變量數據,表達式結果數據)則該函數就會返回該數據到“調用的位置":
通常情況下,函數返回的數據都是以”值傳遞“的形式返回,函數中的變量的值”拷貝“一份,然后返回給接收的位置的相應代碼(賦值,輸出,計算)。
但我們也可以讓函數中的變量的數據的值,以”引用傳遞“的方式返回,形式如下:
定義函數:
function $函數名(parameter1,parameter2,...) { //函數名前有個引用符號
$result = 0; //初始化
......
return $result; //此時返回數據,只能是變量
}
調用函數:
$v1 = $函數名(argument1,argument2,...); //引用返回的函數,自然是指有返回值
函數的其他形式:
1:可變函數 -- 就是函數名“可變”,其實跟可變變量一樣道理
$str1 = "f1"; //只是一個字符串,內容為"f1"
$v1 = $str1(3,4); //形式上看起來是一個變量后面加上括號,則其本質是該變量的“內容”(f1)后面加括號,即這里是調用函數f1(3,4)。實際應用中,常常是需要根據“用戶給定”的數據,來決定調用哪個函數,比如:
function jpg() {處理jpg圖};
function png() {處理png圖};
function gif() {處理gif圖};
$fileName = get_fileName() {獲取用戶上傳的圖片名};
$houzhui = get_houzhui($fileName);
$houzhui();
2:匿名函數 -- 就是沒有名字的函數,其有兩種表現形式:
表現形式1:
$f1 = function() {...函數體;}; //這里的匿名函數定義形式上沒有名字,但其實又將之賦值給了變量$f1;使用時,就跟“可變函數”一樣了:$v1 = $f1();
表現形式2:
調用其他函數(匿名函數,argument1,argument2,...);
說明:
1:此形式的匿名函數只有定義的函數體(無函數名)
2:此形式的匿名函數只能作為其他函數調用時的參數(其他函數通常有特定用處)
3:此匿名函數會在調用其他函數的“過程中”被執行。
能夠使用(匿名)函數當作實參的函數,并不多!
其中有一個常見的是:call_user_func_array();
其使用形式為:
call_user_func_array(匿名函數,數組);
含義:將數組當作匿名函數的若干個實參,傳遞到該匿名函數中,并可以從該匿名函數中返回數據,執行該匿名函數。
變量的作用域:
通常說作用域,有2個:
局部作用域:只能在所定義的函數范圍內使用
全局作用域:在函數的“外部”范圍使用
-- php中,局部和全局作用域是不重疊的。
-- js中,全局作用域是包括局部作用域的。
但還有兩個:
超全局:就是函數的內部與外部都可以使用。
超全局變量只有系統內部預定義的那幾個,我們不能在程序中創建超全局變量
靜態局部作用域:其實也是局部,但多一個特征:數據能夠在函數退出后仍然保持不丟失。
局部訪問全局變量的特定語法:
1:在局部范圍內使用 global 關鍵字對全局變量進行一次“聲明”,則就可以使用了
說明:
1:實際上,函數中的 global 語句,其實是創建了一個跟外部變量同名的局部變量,并通過“引用”的方式指向了外部變量的數據區
實例:
2:在函數中(局部范圍),使用$GLOBALS超全局數組來引用(使用)全局變量
$GLOBALS超全局數組的作用是用于存儲所有全局變量的數據:變量名為下標,變量值為對應元素值。
但通過$GLOBALS操作全局變量,是直接操作(而不是引用操作),即如果unset該對應元素,則全局變量對應變量也被unset掉:
3:實際上,我們還可以在函數內部直接使用$GLOBALS數組,添加元素的方式來創建全局變量,自然也就類似局部使用全局
全局訪問局部變量的特定語法:
1:通過引用傳遞的方式向形參傳遞一個引用實參變量
$v1 = 10;
function f1(&$p1,$p2) {...} //$p1是函數的形參,也即就是函數的內部(局部)變量
$v2 = f1($v1,10); //此時我們認為$v1就可以使用函數中$p1的值。
2:使用函數的引用返回形式:見前面引用的方式返回數據
3:函數中使用global關鍵字來首次引用一個全局變量,則函數結束后在全局范圍就可以使用該變量了
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。