PHP函式,引數,可變參函式.

alansleep發表於2013-02-01

首先,php的函式的格式:

function test($p1,$p2)
{
     return $v;
}

樣式上和c/c++比,多了關鍵字function來表明這個個函式.而c/c++則是返回型別.而函式的引數弱型別語言php沒有引數型別,直接是$了.還有的是php的函式不區分大小寫.如果你樂意,這裡你可以寫成TeSt(). 還有的是php函式的實參(就是呼叫函式時投遞的引數變數可以比申明的函式多.比如你申明的函式是function test($p1);你可以呼叫時投遞額外的實參:test($v1,$v2);雖然$v2你基本上在函式裡用不到. 下面是些細節了.

預設引數:
php函式預設引數和c/cpp類似.都必須設定預設值.比如:

function test($p1,$p2 = 0,$p3 = 0)
{
    return $p1 + $p2 + $p3;
}
echo test(1).'<br/>;
echo test(1,1).'<br/>';
echo test(1, ,1).'<br/>';  // 錯誤,不可以漏掉前面的引數.

當然預設值用null也可以,那函式實現時應該要判斷isset($p2)和$p3了.

函式返回值:
php的函式宣告裡沒有返回值型別,返回值型別依賴於函式實現裡有效的return 的變數型別.比如同一個函式可能返回數值型,字元型,陣列.這對c/c++er很奇怪,但是你想到php是弱語言,就淡然了.如下程式碼:

function testa($p)
{
    if($p == 1)
        return 1;
    else if($p == 2)
        return 'a';
    else
        return array(1,'a');
}

echo testa(1).'<br/>';
echo testa(2).'<br/>';
echo testa(3).'<br/>';

和c/c++一樣函式只允許返回一個值,但是php為了讓更方便返回多個值,就為返回陣列時方便取出返回值而多設計出一個'函式':list();你可以這樣來獲取多個返回值:

list($r1,$r2) = testa(3);
echo $r1.'  '.$r2.'<br/>';
list(,$r2) = testa(3);  // 還可以略過不需要的返回值.
echo '  '.$r2.'<br/>';

一些認真的同學可能注意到list'函式'的'變參'和前面所述的函式預設引數似乎有矛盾.這裡要注意的是list()和array一樣都不是函式. 略過不需要的返回值比較有意思,如果一個專案里約定好,一個函式第1個返回值是函式執行結果的錯誤碼,然後才是返回值,這樣一個函式的返回結果就更規範而且更有意義.這和go語言比較好的一個特性返回值有些類似了.

變參函式:
有上面的基礎,想實現一個可變參函式目前看,至少有一種可行的笨方法:就是預先申明好足夠多的引數.這在c/c++中是行不同的,因為它必須知道變數型別,而php不需要. 比如:

function cat($var1,$var2=null,$var3=null,$var4=null) // 有多長就有多笨啦.
{
    if(isset($var2))
        $var1 .= $var2;
    if(isset($var3))
        $var1 .= $var3;
    if(isset($var4))
        $var1 .= $var4;
    return $var1;
}
echo cat('a').'<br/>'; 
echo cat('a','b').'<br/>';    
echo cat('a','b','c').'<br/>'; 
echo cat('a','b','c','d').'<br/>'; // 但是可行.

而更好的做法是使用func_get_args()來獲取函式實引數組,func_num_args()獲取個數.下面的程式碼演示:

function testmulti()   
{   
    $arr = func_get_args();   
    $num = func_num_args();   
    foreach ( $arr as $k => $v )   
    {   
        echo $k,'->',$v,'<br/>';   
    }   
    echo $num;   
}   
testmulti('p0','p0','p0');

同樣在不是明顯變參函式,但投遞了更多實參的函式裡同樣可以獲取.

函式就介紹到這了.下一篇準備總結php變數的作用域,區域性變數,全域性變數,還有什麼超全域性變數.以及頁面之間變數的使用,傳遞等.這方面和c/c++相差很大.

我的部落格

相關文章