php之初識函式
目錄
簡介
為了提高開發效率,提升程式碼的可維護性,相同操作的程式碼可以封裝成一個函式(方法)
函式的結構
- 關鍵字
function
- 函式名,以字母下劃線開頭,數字字母下劃線組成,例如:
getLastSql
- 引數列表 ,圓括號所包括部分,例如:
($a,$b)
- 函式體,花括號所包括的部分,l例如:
{}
- 返回值 return 部分,有的函式沒有返回值,返回值型別可以為任何物件,例如:
return $sum;
函式的特性
- 形參與實參
funcction sum($a,$b){ //引數列表裡面的兩個引數 $a、$b 就是形參 => 函式定義時,引數列表裡的引數 return $a + $b; } echo sum(2,3); //函式被呼叫時的引數被稱為實參 注:形參在函式被呼叫時,才會被系統分配記憶體空間。一旦函式執行完畢後,形參的記憶體空間將被釋放 當實參引數數量大於等於形參引數數量時,函式會正常執行,否則會報錯
- 預設值,
預設值必須是常量表達式,並且預設值引數排在函式引數列表的最後
- 強型別引數:為引數列表中的引數指定型別,如果型別不匹配,則會丟擲
TypeError
異常
支援型別的型別有:class/interface name
,array
,callable
,boolean
,float
,string
,int
等,設定強型別引數的時候,不要忘記設定強型別declare(‘strict_types = 1’)
- 可變數量的引數列表
顧名思義就是引數數量可變的引數列表,有兩種實現方式
1、func_num_args()
返回引數數量,func_get_arg
返回引數列表中的某一項func_get_args
返回引數列表的的陣列
2、...$args
函式的引數都放在了$arg
陣列當中- 值傳遞與引用傳遞
1、值傳遞可以理解成單向傳遞,實參傳遞給形參,而形參不能傳遞給實參,在記憶體中,形參單元與實參單元是不同的單元,在函式被呼叫時,系統會給形參分配記憶體空間,執行完畢後,釋放形參的記憶體空間,實參的值保持不變。
2、引用傳遞,可以理解成雙向傳遞,引用傳遞不會對形參再次分配記憶體空間,而是直接是用原來的記憶體空間,這將會引起相應的之會產生變化。關鍵字
&
,在函式呼叫時,不需要再次使用&
- 變數的作用域
變數是有變數範圍和生命週期的,按範圍來分的話可以分為區域性變數和全域性變數
區域性變數可以分為
1、當前頁面中宣告的普通變數,不能在函式或者類中起作用
2、當前頁面中宣告的普通變數,不能被傳遞到其他頁面
3、在函式中生命的普通變數,在函式內部有效
4、在類中宣告的屬性,在類的內部有效全域性變數
global
對於PHP 而言,當前頁面宣告的變數都是全域性變數,對當前頁面有效,不能被函式或者類中的方法使用,如果想要使用就需要使用global
關鍵字,或者$GLOBAL
全域性變數,兩者的不同點是,global
開闢了新的記憶體空間,而超全域性變數$GLOBAL
使用的原來的記憶體空間
static
靜態變數靜態變數僅在區域性函式域中存在,函式執行完後,靜態變數保留原來的值
function test_static(){ static $a = 0; //靜態變數初始化的時候,不能是函式表示式 $a++; return $a; } $a = test_static(); $b = test_static(); $c = test_static(); var_dump($a,$b,$c); 結果依次輸出 1,2,3
複雜函式
- 可變函式
變數名後有圓括號,PHP將尋找與變數值相同的函式並執行它
echo、print、unset、isset、empty、require、include等函式是語言結構,不能被用作可變函式
- 巢狀函式
顧名思義,函式中巢狀函式,他獨特的特點就是,當外部函式被呼叫時,內部函式會自動進入全域性域中,成為新的定義函式
function out($a){ $a++; function in($b){ $b--; return $b; } return $a; }
- 遞迴函式
函式在它的函式體內呼叫它自身,這種函式成為遞迴函式,作用:分解問題,呼叫自身
例如:求n的階乘function recursive($num){ if( $num == 1 ) //特別注意:使用函式遞迴的時候, return $num; $res = $num * recursive($num - 1); return $res; }
- 匿名函式
匿名函式也稱閉包函式,允許建立一個沒有指定名稱的函式,最經常用作回撥函式的引數的值。
function closure($name,Closure $closure){ echo "Hi~ my name is {$name},"; $closure(); } $name = 'Ben'; $age = 'six'; $brief = 'little sexy boy'; closure($name,function() use($age,$brief) { // use 額外的引數變數時,該變數必須定義在use的前面,當然也可使用引用傳遞進行傳值 echo " my age is $age , a $brief"; }); 結果為:Hi~ my name is Ben,my age is six , a little sexy boy