2016-01-12 58 views
0
function fu($arg1 = null, $arg2 = null, $arg3 = null, $arg4 = null){ 
    echo 'helo world'; 
} 
//can be other defaults instead null; 

fu('arg1'); 
fu(,,'arg3'); 
fu(,'arg2',,'arg4'); 

如果有可能會丟失任何參數,我該怎麼稱呼fu? 我不能使用fu(null,'arg2',null,'arg4'); ,因爲arg1,arg3的缺省值可能在inf中函數調用缺失參數

+1

可能重複的[調用函數時使用默認值](http://stackoverflow.com/questions/1620737/using-default-value-when-calling - 功能) –

+0

答案在這裏,但我認爲你需要更具體的關於你的問題,因爲我們對你真正想要的東西感到茫然...... –

回答

2

您有幾個選項來處理這種情況。這裏2我可以考慮。

使用數組

對於數組你不與你的功能多少個參數接收,並且每個參數命名(用鑰匙在陣列中)

function fu($param = array()) { 
    // you can test here is $param['arg1'] exists, $param['arg2'] and so on 
    echo 'helo world'; 
} 

打擾使用func_get_args

這樣你就可以有多少個參數你喜歡的功能,但它們並沒有命名爲

function fu() 
{ 
    foreach (func_get_args() as $index => $value) { 
     echo "Argument {$index} is: \n", var_export($value); 
    } 
} 
+0

我相信'func_get_args'不是一個好的解決方案,如果該函數被調用超過2次相同的_default_參數。 –

+2

提問的人也不清楚他的意圖是什麼。如果你正在尋找一個可以接受多個參數/參數的函數 –

0

只需將''替換爲函數調用的錯誤參數。 ('','','arg3','arg4');

+0

並且...這將是空字符串參數。 –

0

您可能來自另一種編程語言,如Python,但在PHP中,您不能跳過這樣的中間參數。可選參數應該是最後的。但是,你可以傳遞一個命名數組來實現你想要的。事情是這樣的:

function fu ($arr =[]) { 
    foreach ([1, 2, 3, 4] as $key) 
     $arr ["arg$key"] =isset($arr["arg$key"]) ? $arr["arg$key"] : null; 

    print_r ($arr) ; 
    echo "<br />"; 
} 

fu (['arg1' => 'arg1']) ; 
fu (['arg3' => 'arg3']) ; 
fu (['arg2' => 'arg2', 'arg4' => 'arg4']) ; 
0

另一種可能的解決方案,擴大了陣列的方法:

function fu($inputArgs = array()) { 
    $defaultArgs = array('arg1' => 'x', 'arg2' => 'y'); 
    $args = array_merge ($defaultArgs, $inputArgs); 

    //either use $args['arg1'] or extract the values: 
    extract($args); 
    // now you can use $arg1, $arg2... directly 
    ... 
} 

您可以通過使用$ inputArgs排列在同一個鍵,例如輸入非缺省值:

fu(array('arg2' => 'z')); 
0

如果您的參數不固定,您可以使用func_get_arg()。現在

function fu(){ 
    $args = func_get_args(); 
    print_r($args); 
} 

你可以通過類似的東西fu()fu('1','null',null)fu(null,'arg2',null,'arg4');

+0

它適合你嗎? –

0

語言如Java提供相同的方法的多種變化,以克服這一點,但在PHP中只有一個變化是可能的。 對於不會使用的參數,您必須使用默認參數值作爲參數。

fu('arg1'); 
fu(null, null, 'arg3'); 
fu(null, 'arg2', null, 'arg4'); 

我上有太多的可選參數的方法的建議是無論你的代碼過於複雜,可以從重構等獲利,創建一個類,並傳遞參數制定者,或者如果你想實現無功能預設數量的參數,它可能是有意義的使用func_get_args();