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:而且只在該函數調用並執行時有效,函數結束,通常這些變量也就“銷毀”
在調用時有實際參數(實參:arguemet)
實參就是一個“實際數據”,該數據可以是一個“直接數據”(比如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(); //獲得一個函數所接收到的所有實參數據個數