目錄
簡介
爲了提高開發效率,提升代碼的可維護性,相同操作的代碼可以封裝成一個函數(方法)
函數的結構
- 關鍵字
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