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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章