1. 程式人生 > >PHP知識點--方法函數

PHP知識點--方法函數

函數名 類型 都是 變量 span 系統 變量名 直接 -s

一、基本使用
1、函數定義形式
function 函數名 (形參1,形參2,.... )
{
//函數體(代碼塊)
}?
函數調用流程分析
o開始調用:實際參數傳數據給形式參數
o程序執行流程進入到函數中(一個獨立的運行空間),跟全局執行空間是隔離的
o按常規的程序邏輯執行函數中的代碼
o如果碰到return語句,則終止函數的執行,跳回函數開始調用的位置;
o如果執行到函數的最後位置,也同樣跳回函數開始調用的位置

2、函數參數問題
在定義時,有形式參數(形參);
1,形參一定是一個變量名!
2,該變量名只能是在該函數中有效的變量名;
3,而且只在該函數調用並執行時有效,函數結束,通常這些變量也就“銷毀”。
在調用時,有實際參數(實參)。
實參就是一個“實際數據”,
該數據可以是一個“直接數據”(比如5,”abc”),也可以是一個變量中存儲的數據。
實參的作用是將其數據“賦值給”形參變量。
實參跟形參之間通常應該有個“一一對應”關系:
定義形式: function 函數名(形參1,形參2,...... ){ 。。。。}

調用形式: 函數名(實參1,實參2,..... )
?默認值不能是對象或資源類型;
?默認值只能是常量表達式,或常量,不能是變量

3、參數的數量問題
1,函數的參數的數量可以是0個或多個——具體多少個,不是語法問題,而是應用問題。
2,通常,實際參數的數量應該跟形式參是的數量一致。
3,但是,在2的基礎上,如果形式參是中有默認值,則實際參數的對應項可以省略。
即:實參的個數,至少應該不少於形參中的非默認值參數的個數。
但:
我們還有一種特殊的處理函數參數的用法:自由參數數量
定義時可以不給定形參,但調用時,卻又可以給定任何個數的實參。
在系統中,var_dump()這個函數也有同樣的使用效果:
var_dump($v1);
var_dump($v1, $v2, $v3); //也可以
這種應用的實現,是依賴與系統中的3個系統函數來達到的:
func_get_args(); //獲得一個函數所接收到的所有實參數據,並結果是一個數組
func_get_arg(n); //獲得一個函數所接收到的第n個實參數據(n從0開始)
func_num_args(); //獲得一個函數所接收到的所有實參數據的個數

4、函數的返回值:
通常情況下,函數返回的數據都是以“值傳遞”的形式返回:函數中的變量的值“拷貝”一份,然後返回給接收的位置的相應代碼(賦值,輸出,計算)。
但:
我們也可以讓函數中的變量數據的值,以“引用傳遞”的方式返回:
形式如下:
定義函數:
function &函數名(形參1,形參2,.....) //註意函數名前有個引用符號“&”
{
$result = 0; //初始化
return $result; //此時返回數據,只能是變量
}
調用函數:
$v1 = &函數名(實參1,實參2,....); //引用返回的函數,自然是指有返回值。

二、函數的其他形式
1可變函數
可變函數,就是函數名“可變”——其實跟可變變量一樣的道理。
$str1 = “f1”; //只是一個字符串,內容為”f1”
$v1 = $str1(3, 4); //形式上看起來是一個變量後面加上括號,則其本質是該變量的“內容”(f1)後面加括號,即這裏是調用函數f1(3, 4);
2匿名函數


匿名函數就是沒有名字的函數,其有兩種表現形式:
表現1:
$f1 = function(){。。。函數體;};
//這裏的匿名函數定義形式上沒有名字,但其實又將之賦值給了變量$f1
使用時,就跟“可變函數”一樣了:$v1 = $f1();
表現形式2:
調用其他函數2(匿名函數,實參1,實參2, ...... );
說明:
1此形式的匿名函數只有定義的函數體(無函數名)
2此形式的匿名函數只能作為其他函數調用時的參數(其他函數通常有特定用處)
3此匿名函數會在調用其他函數的“過程中”被執行。
能夠使用(匿名)函數當作實參的函數,並不多!
其中有一個常見的是:call_user_func_array();
其使用形式為:
call_user_func_array(匿名函數,數組);
含義:
將數組的每一項當作該匿名函數的若幹個實參,傳遞到該匿名函數中,並執行該匿名函數,並可以從該匿名函數中返回數據。

三、變量的作用域
局部作用域:只能在所定義的函數範圍內使用。
全局作用域:在函數的“外部”範圍使用。
——php中,局部和全局作用域是不重疊的
——js中,全局作用域是包括局部作用域的
超全局:就是在函數的內部和外部都可以使用。
超全局變量只有系統內部預定義的那幾個,我們不能再程序中創建超全局變量。
靜態局部作用域:其實也是局部,但多一個特征:數據能夠在函數退出後仍然保持不丟失。

局部訪問全局變量的特定語法
1,在局部範圍內,使用global關鍵字對全局變量進行一次“聲明”,則就可以使用了:
語法:global $變量名;
2,在函數中(局部範圍),使用$GLOBALS超全局數組來引用(使用)全局變量:
$GLOBALS超全局數組的作用是用於存儲所有全局變量的數據:變量名為下標,變量值為對應元素值。
但通過 $GLOBALS操作全局變量,是直接操作(而不是引用操作),即如果unset該對應元素,則全局變量對應變量也被unset:
3,實際上,我們還可以在函數內部直接使用$GLOBALS數組,添加元素的方式來創建全局變量,自然也就類似局部使用全局:

全局訪問局部變量的特定語句
?通過引用傳遞的方式向形參傳遞一個引用實參變量
o$v1 = 10;
ofunction f1( &$p1, $p2){ ...... } //$p1是函數的形參,也即就是函數的內部(局部)變量
o$v2 = f1( $v1, 10); //此時我們認為$v1就可以使用函數中$p1的值。
?使用函數的引用返回形式:見前面引用傳遞的方式返回數據
?函數中使用global關鍵字來首次引用一個全局變量,則函數結束後在全局範圍就可以使用該變量了

有關函數的系統函數:
?function_exists():判斷某個函數是否被定義過,返回布爾值
oif( function_exists(“ func1 “) == false ){
?function func1(){。。。。。。};//定義函數
o}
?func_get_arg(n):獲得一個函數的第n個實參值(n從0開始)
?func_get_args():獲得一個函數的所有實參,結果是一個數組
?func_num_args():獲得一個函數的所有實參的個數。

四、有關函數的編程思想
遞歸思想(遞歸函數)
遞推思想(叠代思想)

PHP知識點--方法函數