文章目錄
- 函數
- 作用域
- 靜态變量
- 可變函數
- 匿名函數
- 閉包
- 僞類型
函數
是一種文法結構,将實作某一個功能的代碼塊(多行代碼)封裝到一個結構中,進而實作代碼的重複利用(複用)
函數定義文法
function sayHello(){
echo 'Hello';
}
//調用方法
sayHello();
示例
function sayHello(){
echo 'Hello';
}
命名規範
由字母、數字和下劃線組成,但是不能以數字開頭,一般采用如下兩種方式命名
1、駝峰法:除了左邊第一個單詞外,後面所有的單詞首字母都大寫:showParentInfo()
2、下劃線法:單詞之間通過下劃線連接配接,單詞都是小寫:show_parent_info()
參數詳解
函數的參數分為兩種:形參和實參
形參:形式參數,不具有實際意義的參數,是在函數定義時使用的參數
實參:實際參數,具有實際資料意義的參數,是在函數調用時使用的參數
預設值
指的是形參的預設值,在函數定義的時候,就給形參進行一個初始指派:
如果實際調用傳入的參數(實參)沒有提供,那麼形參就會使用定義時的值來進入函數内部參與運算。
示例:
//定義方法
function sayHello($name = 'zhagnsan'){
echo 'Hello '.$name;
}
//調用方法
sayHello();
sayHello('lisi');
預設值的定義是放在最右邊的,不能左邊形參有預設值,但是右邊沒有
引用傳遞
實參在調用時會将值指派給形參,那麼實際上使用的方式就是一種簡單的值傳遞:
将實參(如果是變量或者常量或者其他表達式)的結果(值)取出來指派給形參:形參與外部實際傳入的參數本身沒有任何關聯關系:隻是結果一樣。
有的時候,希望在函數内部拿到的外部資料,能夠在函數内部改變,那麼就需要明确告知函數(定義時),函數才會在調用的時候去主動擷取外部資料的記憶體位址。
以上這種定義形式參數的方式叫作引用傳遞
示例如下
function test($a,&$b){
$a++;//修改值
$b++;//修改值
}
//test(1,1)//應用傳遞的參數 在傳入實參的時候,必須傳入變量 直接傳值會報錯
$a=1;$b=1;
test($a,$b);
echo $a,$b//1 2
函數傳回值
指的是将函數實作的結果,通過return關鍵字,傳回給函數外部(函數調用處):在PHP中所有的函數都有傳回值。(如果沒有明确return使用,那麼系統預設傳回NULL)
作用域
作用域:變量(常量)能夠被通路的區域
在PHP中作用域嚴格來說分為兩種:但是PHP内部還定義一些在嚴格意義之外的一種,是以總共算三種:
1)全局變量:就是使用者普通定義的變量(函數外部定義)
所屬全局空間:在PHP中隻允許在全局空間使用:理論上函數内部不可通路(但是可以通過 G L O B A L S 訪 問 ) 腳 本 周 期 : 直 到 腳 本 運 行 結 束 ( 最 後 一 行 代 碼 執 行 完 ) 2 ) 局 部 變 量 : 就 是 在 函 數 内 部 定 義 的 變 量 所 屬 當 前 函 數 空 間 : 在 P H P 中 隻 允 許 在 當 前 函 數 自 己 内 部 使 用 函 數 周 期 : 函 數 執 行 結 束 ( 函 數 是 在 棧 區 中 開 辟 獨 立 内 存 空 間 運 行 ) 3 ) 超 全 局 變 量 : 系 統 定 義 的 變 量 ( 預 定 義 變 量 : GLOBALS 通路) 腳本周期:直到腳本運作結束(最後一行代碼執行完) 2)局部變量:就是在函數内部定義的變量 所屬目前函數空間:在PHP中隻允許在目前函數自己内部使用 函數周期:函數執行結束(函數是在棧區中開辟獨立記憶體空間運作) 3)超全局變量:系統定義的變量(預定義變量: GLOBALS通路)腳本周期:直到腳本運作結束(最後一行代碼執行完)2)局部變量:就是在函數内部定義的變量所屬目前函數空間:在PHP中隻允許在目前函數自己内部使用函數周期:函數執行結束(函數是在棧區中開辟獨立記憶體空間運作)3)超全局變量:系統定義的變量(預定義變量:_SERVER、$_POST等)
所屬超全局空間:沒有通路限制(函數内外都可以通路)
作用域示例:
$name ='zhangsan';
function test(){
// echo $name; //函數内通路該變量會報錯
echo $GLOBALS['name'];//這樣就可以通路
}
test();
還有一種方式,能夠實作全局通路局部,同時局部也可以通路全局:global關鍵字
1、如果使用global定義的變量名在外部存在(全局變量),那麼系統在函數内部定義的變量直接指向外部全局變量所指向的記憶體空間(等同于一個變量);
2、如果使用global定義的變量名在外部不存在(全局變量),系統會自動在全局空間(外部)定義一個與局部變量同名的全局變量
本質:在函數的内部和外部,對一個同名變量(全局和局部)使用同一塊記憶體位址儲存資料,進而實作共同擁有
示例:
$name ='zhangsan';
function test(){
global $name; //已經存在的變量 則 指向引用
echo $name;//zhagnsan
global $age; //不存在的變量 建立
$age =12;
}
test();
echo $age;//12
靜态變量
是在函數内部定義的變量,使用static關鍵字修飾,用來實作跨函數共享資料:
函數運作結束所有局部變量都會清空,如果重新運作一下函數,所有的局部變量又會重新初始化
示例:
function test(){
static $age =1;
$age++;
echo $age;
}
test();//2
test(); //3
可變函數
目前有一個變量所儲存到值,剛好是一個函數的名字,那麼就可以使用變量+()來充當函數名使用
示例:
function test(){
static $age =1;
$age++;
echo $age;
}
$name = 'test';
$name();//輸出 2 可以調用test 函數
匿名函數
沒有名字的函數
基本文法:
變量名 = function(){
函數體
};
示例:
$test = function(){
echo 'hello';
};
$test();
閉包
閉包簡單了解就是一個函數根據參數,傳回一個匿名函數,然後調用匿名函數實作功能
示例:
function test(){
$name =__FUNCTION__;
$innerfunc = function ()use($name){
echo $name;
};
return $innerfunc;
}
$test1 = test();
$test1();//test
僞類型
假類型,實際上在PHP中不存在的類型。但是通過僞類型可以幫助程式員去更好的檢視操作手冊進而更友善學習
僞類型主要有兩種:在三大類八小類之外
Mixed:混合的,可以是多種PHP中的資料類型
Number:數值的,可以是任意數值類型(整形和浮點型)