php中的函數
函數,由於php是弱類型的語言,這不但使得php變數與眾不同,同時也使得php函數也變得與眾不同。
在php中函數的聲明方式很簡單:如下
function fcuntion_name([參數列表])
{
}
函數可以分為這麼幾類:
(1).常規參數函數,就是參數中規中矩。在函數該變參數的值,對原變數無影響。
(2).引用參數的函數,即傳入的參數是某個參數的引用,在函數中改變參數的值,對原變數的值有影響。但是用unset()函數登出函數中的引用變數
只是登出了函數中的對應的變數不會登出原變數。如下:
$t=2;
function test(&$m)
{
$m=5
unset($m)
}
test($t);
echo $t; //輸出5,即改變引用參數的值會改變原變數的值,但是在函數中登出引用參數,只是登出了引用參數指向原變數地址,而不是登出了原變數。
(3).預設參數函數,即在函數定義時,就對一些參數進行賦值,預設參數從右向左排列。如
function user( $name ,$pwd=123 ,$stu_no='20132577' )
{
}
在調用時,要是沒有對已經有預設值的參數賦值,則使用該參數的預設值。要是在調用時對預設參數賦值了,則覆蓋原來的預設值。
(4).可變參數個數的函數,即函數的參數在定義時是不定的,在調用函數時,才可以確定參數個數。
這樣的函數需要,使用php系統內建的函數 func_get_args()獲得調用函數時,包含輸入的所有參數的數組。
或者通過func_num_args()獲得調用函數時,輸入參數的個數。和配合func_get_arg($index)獲得指定位置的輸入參數。
定義方式如下:
function test()
{
$args=func_get_args(); //一次性獲得包含所有的輸入參數的數組,
for($i=0;$i<$count($args);$i++)
{
......
}
}
或者是通過指定位置,獲得相應的參數。
function test()
{
$length=func_num_args(); //獲得輸入參數的個數,
for($i=0;$i<$length);$i++)
{
$arg=func_get_arg($i);//根據參數索引獲得參數值。
}
}
(5).變數函數,變數函數其實和可變變數是一樣的原理。
如:定義一個函數 test()
function test()
{
}
$t='test';//我們可以稱他為變數函數,該變數的值是一個函數名的字串。$t();//調用函數test()
(6).回呼函數,回呼函數就是使用變數函數作為參數,實現函數功能的擴充。
如定義一個user函數和一個identiyt函數如:
function identiyt()
{
}
function user($function_variable)
{
$function_variable();//user函數回呼函數名為$function_variable的函數。
}
$function_variable='identiyt';
user($function_variable);//回調identity函數。
一般我們還可以通過系統函數 call_user_func_array([變數函數],[參數數組])自訂回呼函數
function t()
{
echo"t function <be />";
}
function y($fun)
{
call_user_func_array($fun,array());
//echo"y function <br />";
}
y('t');
以上使用call_user_func_array()函數,只是調用了全域函數,並不能調用類中的函數,類中靜態函數。那類中定義的函數和靜態函數如何調用呢。
類中的函數:以上使用call_user_func_array( array(new class(),function_name) ,array([參數]))
類中的靜態函數: 類中的函數:以上使用call_user_func_array(array(class,function_name),array([參數]))
(7)匿名函數,也叫做閉包函數,與js中的匿名函數是一樣的。
$t=function (){};//將匿名函數賦值給一個變數$t
$t();//調用匿名函數。
(8)閉包
閉包可以從父範圍中繼承變數。任何此類變數都應該用 use 語言結構傳遞進去。怎麼理解呢。 因為我們知道在函數中定義的變數是局部變數,那麼在函數中再定義一個閉包函數(匿名函數),這個閉包函數是無法是直接從他的父函數中繼承變數的,因為閉包函數有無法像父函數那樣通過global擷取全域變數那樣來從父函數中獲得在父函數中定義的變數,所以閉包函數需要一種新的繼承方式,這種方式叫做閉包。關鍵字為use
例如:
function add1()
{
$a=10;
$b=20;
$callback=function() use($a,$b)//通過use 繼承父函數中的兩個變數,要是不僅想獲得變數的值,還想改父函數的變數,
{ //通過繼承變數的引用如 use(&$a,&$b)
echo $a+$b;
};
$callback();
}
add1();
閉包有一個好處,就是通過繼承父函數中變數的引用,可以減少迴圈次數。