2011-03-11 29 views
18

我剛剛發現在PHP中有一個叫做func_get_arg的函數,它使開發人員能夠使用不同的風格來獲取參數。 這似乎是非常有用的,因爲參數的數量現在可以是任意的,但我想不出任何使用它的好例子。在PHP中使用'func_get_arg'的好例子是什麼?

使用此函數充分利用其多態特性的一些示例是什麼?

+0

http://us2.php.net/manual/en/function.func-get-arg.php向下滾動到'Examples',然後閱讀'User Contributed Notes' – drudge

+0

'sprintf'和'max'很好可以處理任意數量參數的函數示例。通常你想用統一類型的參數來使用它。 – mario

+4

你不是指'多態':你正在尋找的術語是'variadic':http://en.wikipedia.org/wiki/Variadic_function –

回答

22

我通常使用func_get_args(),如果想要多個參數,更易於使用。

例如,重新創建PHP的max()

function max() { 
    $max = -PHP_INT_MAX; 
    foreach(func_get_args() as $arg) { 
     if ($arg > $max) { 
      $max = $arg; 
     } 
    } 
    return $max; 
} 

CodePad

現在你可以做echo max(1,5,7,3)並得到7

+4

你知道,你可以減少,如果你會原諒雙關語,直到array_reduce(func_get_args(),'max')',它也可以與負數一起工作。 –

+0

@Keith也許我應該讓這個初始數字爲'-PHP_INT_MAX'。 – alex

+1

唯一的問題是,如果你沒有參數,答案是'-PHP_INT_MAX'。 'array_reduce($ a,'max')'即使對於一個空數組也是可行的,在這種情況下它會返回null。我們在這裏討論一些話題。:-) –

1

我幾乎沒有使用func_get_arg(),但我確實使用它的堂兄func_get_args()相當多。這裏有一個例子,沿echo語句線功能實體編碼它的所有參數:

function ee() { 
    $args = func_get_args(); 
    echo implode('', array_map('htmlentities', $args)); 
} 

我使用的功能相當多。

下面是另一個有用的示例,這個函數與SQL的COALESCE()函數完成相同的工作。

function coalesce() { 
    $args = func_get_args(); 
    foreach ($args as $arg) { 
     if (!is_null($arg)) { 
      return $arg; 
     } 
    } 
    return null; 
} 

它返回傳入的第一個非空參數,或者null如果沒有這樣的說法。

+2

[你可以刪除第一個參數](http://codepad.org/Gil0Xi29)到'implode()'。 – alex

+3

習慣的力量 - 自從PHP 4.0出現後不久,我一直在用PHP編寫代碼。 –

1

就我個人而言,我認爲在正常函數內部沒有好的用例。作爲一個控制怪胎,我想知道傳遞給我的函數到底是什麼,我想知道我正在傳遞什麼。

但是,它可以用於動態/靜態URL路由之類的東西。當你正在重寫(通過mod_rewrite)時,URL會被引用到一個引導程序中。

從這個意義上說,您可以擁有不一定需要每個頁面請求都存在的參數。

2

首先,您使用的術語「多態性」完全錯誤。多態性是面向對象編程中的一個概念,它與函數中可變數量的參數無關。

根據我的經驗,所有func_get_args可以讓你做的是添加一點句法糖。

想象一個函數可以接受任意數量的整數並返回它們的總和。 (我是作弊,因爲這已經存在於array_sum中,但如果它保持簡單的例子,作弊是很好的)。你可以這樣來做:

// you can leave "array" out; I have it because we should be getting one here 
function sum1(array $integers) { 
    return array_sum($integers); 
} 

現在你會調用這個像這樣:

$sum = sum1(array(1)); 
$sum = sum1(array(1, 2, 3, 4)); 

這是不是很漂亮。但是,我們可以做的更好:

function sum2() { 
    $integers = func_get_args(); 
    return array_sum($integers); 
} 

現在你可以這樣調用:

$sum = sum2(1); 
$sum = sum2(1, 2, 3, 4); 
2

比方說,我們有一個包含數據的多個陣列中,我們需要在不合並跨他們的價值觀鍵搜索這些陣列。

數組是這樣的:

$a = array('a' => 5, 'b' => 6); 
$b = array('a' => 2, 'b' => 8); 
$c = array('a' => 7, 'b' => 3); 

在這種情況下,說我們需要從所有的陣列拿到鑰匙a的所有值。我們可以這樣寫採取陣列的任意數量的搜索功能

// we need the key, and at least 1 array to search in 
function simpleSearchArrays($key, $a1){ 
    $arrays = func_get_args(); 
    array_shift($arrays); // remove the first argument, which is the key 
    $ret = array(); 
    foreach($arrays as $a){ 
     if(array_key_exists($key, $a)){ 
      $ret[] = $a[$key]; 
     } 
    } 
    return $ret; 
} 

,如果我們使用的功能:

$x = simpleSearchArrays('a', $a, $b, $c); 

$x則包含array(5, 2, 7)

0

閱讀官方文檔,發現func_get_args()
獲取函數參數列表的數組。

該函數可與func_get_arg()func_num_args()一起使用,以允許用戶定義的函數接受可變長度參數列表。

<?php 
     function foo() 
     { 
      $numargs = func_num_args(); 
      echo "Number of arguments: $numargs \n"; 
      if ($numargs >= 2) { 
       echo "Second argument is: " . func_get_arg(1) . "\n"; 
      } 
      $arg_list = func_get_args(); 
      for ($i = 0; $i < $numargs; $i++) { 
       echo "Argument $i is: " . $arg_list[$i] . "\n"; 
      } 
     } 

     foo(1, 2, 3); 
?> 
0

從php5.6開始,沒有使用func_get_arg的用例;這並不是說,不需要它的功能了,但由variadic function使用...語法代替:

/** 
* @param array $arguments 
*/ 
public function poit(...$arguments) 
{ 
    foreach($arguments as $argument) { 
     ... 
    } 
} 

如果有在端重載方法,這是特別有用的;一個人需要再篩選出第一個參數,如展示由an example

使用 func_get_arg

舊風格:

function foo($a, $b) { 
    $c = array(); 
    if (func_num_args() > 2) { 
     for($i = 0; $i < func_num_args()-2; $i++) { 
      $c[] = func_get_arg($i+2); 
     } 
    } 
    var_dump($a, $b, $c) 
    // Do something 
} 
foo('a', 'b', 'c', 'd'); 

較新的可變參數的風格;

function foo($a, $b, …$c) { 
    var_dump($a, $b, $c); 
    // Do something 
} 
foo('a', 'b', 'c', 'd'); 

這兩個foo產生相同的輸出,其中一個更容易編寫。

相關問題