1. 程式人生 > >php之初識函式

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