2011-09-29 46 views
0

如果我有以下功能:功能的可變長度參數列表

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

我可以調用這個函數,只有通過爲$ d值,因此使所有與他們默認的其他參數?隨着代碼是這樣的:

foo('bar'); 

或者我有這樣的事情稱之爲:

foo(null, null, null, 'bar'); 
+0

可能的重複http://stackoverflow.com/questions/5968965/php-default-arguments – Yousf

+0

@Quasdunk,你的意思是說它像'foo('','','','bar')' ? – freshest

+0

你必須通過所有以前的參數,因爲PHP不支持Python那樣的命名參數。但看看[this](http:// stackoverflow。com/questions/7559305/php-passing-array-to-function/7559391#7559391)可以幫到你 –

回答

1

不,你不能。使用數組:

function foo($args) { 
    extract($args); 
    echo $bar + $baz; 
} 

foo(array("bar" => 123, "baz" => 456)); 

在php.net上編寫一個bug報告,並要求他們爲該語言添加命名參數!

+0

請不要在php.net上寫一個bug報告,要求命名參數,因爲多年來已經寫了幾個,所以任何新的bug都是重複的。開發人員(甚至是最近)已經就這個主題進行了大量討論,但沒有決定將此功能添加到PHP中。但是,請隨時就此主題起草[RFC](https://wiki.php.net/rfc),並在[PHP內部郵件列表](http://php.net/)上再次討論它郵寄-lists.php)。 – salathe

+0

絕對正確,不幸的。 – salathe

1

你必須使用空像你說:

foo(null, null, null, 'bar'); 

如果您不介意創建更多的功能,你可以做這樣的事情,我會想象整體代碼會更整潔。

function update_d($val){ 
    foo(null, null, null, $val); 
} 

或者你可以使用數組,像這樣:

$args = array($a = 'a', $b = 'b', $c = 'c', $d = 'd'); 
foo($args); 
0

你必須要做得像

foo(null, null, null, 'bar'); 

另一種方法是離開的論點出函數簽名,並使用func_get_args()檢索值;

function foo() { 
    $args = func_get_args(); 

但隨後的是,如果你離開了前三null值,也沒有辦法知道「酒吧」是$d參數。請注意,這種方法在大多數情況下都是不可取的,因爲它混淆了你的函數簽名並且損害了性能。

0

簡答:第 長答案:Nooooooooooooooooooooooooooooo。

當完全沒有設置變量時將使用默認參數值。

-1

func_get_args() - 獲取函數參數列表的數組。
func_num_args() - 返回傳遞給函數

function foo() 
{ 
    $numargs = func_num_args(); 
    echo "Number of arguments: $numargs<br />\n"; 
} 


foo(a); foo(1,b,c); will work fine 
+0

爲什麼投下來?? – diEcho

0

你不能做沒有overloading技術參數的個數。

在這種情況下,您的程序假定如果只有一個參數通過,則是第四個參數。