2013-03-27 75 views
2

我正在尋找最優雅的方式來傳遞可變數量的參數來傳遞函數。php - 動態變量傳遞函數

考慮這樣的功能:

function abc ($x, $y, $l, $m) { 
... 
} 

有一種優雅的方式沒有很多的「如果」或變量考取作爲一個變量數組來調用一個函數:

all ($x, $y, $l, $m) arguments 
first three ($x, $y, $l) arguments 
first and third ($x, $l) arguments 
only second ($y) argument 
last two ($l, $m) arguments 

請諮詢。

+0

您是否在尋找[func_get_args()](http://www.php.net/func_get_args)或替代它? – 2013-03-27 15:34:47

+0

不幸的是 - 既不 – Kalreg 2013-03-27 15:40:09

+0

因爲你不能在PHP中命名參數,函數如何理解你是否傳遞前3個或後3個參數?除非你使用數組(但你說你想避免它) – Uby 2013-03-27 15:49:13

回答

5

我寧願使用一個數組作爲參數和函數內部檢查,看看你的變量存在:

function abc ($data) { 

    if(isset($data['x']){ 
     //whatever 
    } 

    if(isset($data['y']){ 
     //whatever 
    } 

    ... 
} 
+5

+在大多數框架中使用數組是常用的方法,可用於可選的命名參數。另請看['extract()'](http://php.net/extract)。 – 2013-03-27 15:36:17

1

看一看func_get_args()func_get_arg()func_num_args()

當然,當你使用這些時,你不可能通過調用abc($x, $l)來獲得「第一」和「第三」參數。您必須致電abc($x, null, $l)

+0

檢查什麼樣的參數是我必須把所有(在這種情況下四個)變量功能...我有時會把一個,另一個時間 - 3所以這不是解決方案 – Kalreg 2013-03-27 15:37:00

+0

所以你需要傳遞一個參數數組,所以你可以使用數組鍵作爲你已經通過參數(x,y,m或l)的標籤。 – 2013-03-27 16:02:26

0

您是否想說要檢查函數中設置了多少個變量? 也許這可以幫助

function abc($a) { 
    $args = func_num_args(); 
    for($i = 0; $i < $args; $i++) { 
     print_r(func_get_arg($i)); 
    } 
} 
abc(1,2,3,4); 
+0

@JasonMcCreary沒有對不起,我沒有在你問之前:)。 – Benz 2013-03-27 15:39:51

+0

儘管這確實利用了PHP的動態特性,但是無法在參數之間進行區分。 – 2013-03-27 15:40:19

+0

- 正如jacon mccreary所說 - 如果我會寫abc(1,2,4)我不會知道4是$ m而不是$ l :( – Kalreg 2013-03-27 15:47:09

0
// use **func_get_args** function to grab all arg passed in funcion 
function variadic($a,$b) { 
    $args = func_get_args(); 
    foreach ($args as $arg) { 
     echo "$arg<br />\n"; 
    } 
} 

// pass as array 
$arg = array('a'=> $a,'a'=> $b) 
function variadic($arg) 
{ 
    if(isset($arg[a])) 
} 
0

我想不出任何確切的替代你的解決方案... 要麼你要通過空到你不參數要發送 像abc (null, $y, null, $m)

或者想到的是使用call_user_func_array的東西,如

$params = array('','y','','m'); 
call_user_func_array('abc', $params); 
0

func重刑ABC($ X = NULL,$ Y = NULL,$ L = NULL,$ M = NULL){

}

你可以這樣調用的功能等:

所有($ X, $ Y,$升,$米)參數

前三($ X,$ Y,$升)參數

第一和第三($ X,NULL,$升)參數

只有第二(null,$ y)參數

最後兩個(NULL,NULL,$ L,$ M)參數

+0

而不是null,你總是可以發送abc(0,0,1,0)然後檢查它 - 如果$ x = 0,那麼忽略它。雖然它不是優雅的方式 – Kalreg 2013-03-27 15:49:42

+0

爲什麼它不是優雅的?你是什麼意思的「優雅」? – Uby 2013-03-27 15:52:49

+0

是的,但你不會做「很多如果」或使用數組。 – 2013-03-27 15:54:00