PHP函式,引數,可變參函式.
首先,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++相差很大.
相關文章
- php實現函式可變引數列表PHP函式
- PHP 函式可變數量的引數列表PHP函式變數
- php 可變函式PHP函式
- Go函式接收可變引數Go函式
- Python 函式(可變引數)Python函式
- 遞迴函式,可變引數列表遞迴函式
- C++ 函式的可變引數C++函式
- C可變引數函式 實現函式
- golang學習之路之函式可變引數Golang函式
- 再學Java 之 形參個數可變函式Java函式
- [C]可變參量,debugprint函式函式
- 函式定義、函式的引數、函式的預設引數函式
- Swift 呼叫 Objective-C 的可變引數函式SwiftObject函式
- php函式之如何用預設引數和可變長度引數方式傳遞?PHP函式
- javascript函式引數和函式內同名變數的關係JavaScript函式變數
- 函式引數 引數定義函式型別函式型別
- Day10 函式基礎+函式三種定義形式 + 函式的返回值、物件和引數 + 可變長引數函式物件
- python---函式引數、變數Python函式變數
- python函式變長引數Python函式
- Javascript函式引數求值——Thunk函式JavaScript函式
- 函式基礎和函式引數函式
- 自己實現一個簡單可變引數函式函式
- TypeScript 函式可選引數和預設引數TypeScript函式
- 函式外與函式內的變數函式變數
- php函式引用傳遞引數的方法PHP函式
- php 的函式引數值型別限定PHP函式型別
- php的函式引數值型別限定PHP函式型別
- php中函式的實參和形參PHP函式
- 函式、引數、解構函式
- 函式引數詳解函式
- [譯] part 12: goalng 變參函式Go函式
- C語言中變參函式傳參探究C語言函式
- 第 8 節:函式-函式定義和引數函式
- 函式的動態引數 及函式巢狀函式巢狀
- 物件,函式作為一個函式的引數物件函式
- Excel函式應用教程:函式的引數(轉)Excel函式
- JavaScript進階系列01,函式的宣告,函式引數,函式閉包JavaScript函式
- 函式呼叫引數變數傳值的問題函式變數