php函式,static,global關鍵字及三種變數作用域
阿新 • • 發佈:2019-02-17
函式
和js函式類似,關注php與其他語言不用的地方
函式的形參預設值
形式:
function f($a,$b=3,$vc = "abc"){ }
注意:沒有給預設值的形參必須傳遞值,
形參的傳值問題
一句話:形參的傳值問題,其實就是“變數之前的傳值問題”,即實參變數傳給形參變數,有值傳遞和引用傳遞
引用傳遞(需要在形參前面加&符號而不是實參):
function f($a,& $b){ }
函式引數的數量的問題
- 通常,形參和實參的數量是一致的;
- 當函式形參有預設值的時候,實參可以進行一定程度的省略(省略只能從右往左省略);
有一種定義和使用函式的特別形式(並不常見)它不定義形參,而實參任意給出,其實系統中也有類似的函式:比如: – 靈活性體現之一
- var_dump($v1);
- var_dump($v1,$v2,$v3);
我們自己也可以定義這種函式,其實,這種函式,依賴的是以下三個系統函式來獲取相應的資訊,以得到實引數據的處理:
- func_get_args(); // 獲取實引數據列表,成為一個數組
- func_get_args(
i);//獲取第 i個實引數據,$i從0開始算起 - func_num_args(); // 獲取實參的數量(個數)
如:
// 系統函式func_get_args()可以獲取函式呼叫時傳遞過來的所有實引數據,並且都放入一個數組中! function f(){ $arr = func_get_args(); }
函式的返回值:函式的返回值不是語法規定,而是業務所需,需要就返回,不需要則無需返回,返回值一定是通過return 語句!
函式的其他形式:
- 可變函式:一個變數的名字是一個變數 – > 靈活性體現
- 可變變數:一個函式的名字是一個變數,其實就是在呼叫函式的時候,使用一個變數名而已,該變數的內部,就是該函式名! – > 靈活性體現
匿名函式
形式1:將一個匿名函式“賦值”給一個變數,然後通過該變數呼叫該函式
$f1 = function (){
};
使用:
$f1(); // 呼叫該匿名函式,和可變函式使用一樣的
形式2:直接將匿名函式作為另外一個函式的實參傳遞進去(因為形參對應的是一個函式)
如:
function f1($a,$b,$sum){ echo "$a =".$a; echo "$b =".$b; $result = $sum($a,$b); echo "result = ".$result; } 呼叫: f1(21,2,function ($a,$b){ returm $a + $b; });
變數作用域
定義:變數可以使用的範圍
php中有三種作用域
- 區域性作用域:在函式內部範圍,對應的變數為區域性變數
全域性作用域:不在函式內部的範圍,–函式外部和程式碼塊中的定義的變數是全域性變數
超全域性作用域:指所有的程式碼範圍,就稱為超全域性變數,其實只有系統預定義的幾個:$_GET,$POST,$_SERVER,$_SESSION,$_REQUEST,$GLOBALS,$_FILES,$_COOKIE..
通常:
- 全域性範圍不能訪問區域性範圍;
- 區域性範圍不能訪問全域性範圍;
- 函式內部的變數(區域性變數),通常在函式呼叫執行結束後,就被“銷燬”了;
- 有一種區域性變數,在函式呼叫結束後不會被“銷燬”,這種變數就是靜態區域性變數(用static修飾)。
區域性作用域使用(訪問)全域性變數?(常見需求)
php中不能像其他語言一樣直接在區域性作用域中訪問全域性變數,
做法1:而要使用global宣告一個要使用的全域性變數的同名區域性變數
如:
$v = 4;
function f(){
global $v; // 使用global宣告一個變數,該變數和全域性變數同名,並和全域性變數共同指向一個數據區,,相當於複製了引用
}
做法2:通過$GLOBALS預定義變數訪問全域性變數,如
$v = 1;
function f(){
echo "\$v = ".$GLOBALS['$v']; // 取得全域性變數$v的值
$GLOBALS['$v'] = 55; // 改變全域性變數$v的值
unset($GLOBALS['$v']); // 釋放$v變數,此時全域性變數$v就變成null了
}
但,如果我們對$GLOBALS變數的某個單元(下標)進行unset,則其就會完全銷燬對應的全域性變數,這裡不是複製了引用
有關函式的系統函式:
- function_exists(函式名) : 判斷一個函式是否存在
- func_get_args();
- func_get_args($index);
- func_num_args()。