2015-07-20 43 views
7

定義數組的默認值/回退值的最佳做法是什麼?函數參數 - 數組默認值|最佳做法

描述:

我的函數接受2個參數。其中之一是一系列可供選擇的選項。如果陣列未獲通過,它有一個默認/備用值作爲例子:

public function selectName($howMany = 1, $seed = ['john', 'bob', 'mark', 'cindy']){... 

配套問題:

一)是存儲在默認參數是一個好主意充滿陣列?

b)哪一個更好,一個常數,array_merge,if(empty...

+0

這取決於場景,你基本上是問什麼更好:合併數組或重新定義它。或者我誤解了? – George

+0

@George我認爲你理解正確。主要問題是:將數組作爲默認函數參數存儲是一個好主意。如果現在 - 哪種解決方案效果最好? –

+0

在參數定義中使用默認值時,沒有什麼*錯誤*,它可能有缺點。再次,情景特定。 – George

回答

4

由於默認值與所有對象共享,所以最好將它們decalre爲static
降低能見度protected建議

class YourClass { 
    protected static $_DEFAULT_SEED  = array('john', 'bob', 'mark', 'cindy'); 
    protected static $_DEFAULT_QUANTITY = 1; 
    public function selectName($howMany = NULL, $seed = NULL){ 
     if (is_null($howMany)) { 
      $howMany = self::$_DEFAULT_QUANTITY; 
     } 
     if (is_null($seed)) { 
      $seed  = self::$_DEFAULT_SEED; 
     } 
     //... 
    } 
} 
+0

我會添加如果(is_null($種子)** ||!is_array($種子)**)....但解決方案得到upvote從我 – donald123

+0

@ donald123改變它,我會Approuve它:),保持連貫我們應該添加:'if(is_null($ seed)||!is_integer($ seed))'... –

0

在我看來,在缺省參數中存儲填充數組並不是一個好主意。如果你用一個沒有你需要的每個鍵的數組來調用函數呢?

例子:

你想

(default): ['option1' => true, 'option2' => false] 
You call the function with: ['option1' => true] 

現在你罵使用陣列的功能,但不具有足夠的鑰匙。所以在我看來,array_merge()是最好的解決方案。

1

更好地傳遞一個空數組作爲參數。

public function selectName($howMany = 1, $seed = array()){ 
    $myarr=['john', 'bob', 'mark', 'cindy']; 
    if(count($seed)>0){ 
     $myarr=$seed; 
    } 
    /* user $myarr now*/ 
} 
-1

在我看來,我在函數直接傳遞數組值

<?php 
public function selectName($howMany = 1, $seed = false){ 
    $seed = (!$seed) ? array('john', 'bob', 'mark', 'cindy') : $seed; 
    // rest of the job ... 
} 

或者,如果陣列中的一些功能使用,我將它傳遞在類CONSTANT這樣的

CONST SEED_DEFAULT_VALUE = array('john', 'bob', 'mark', 'cindy'); 

public function selectName($howMany = 1, $seed = false){ 
    $seed = (!$seed) ? self::SEED_DEFAULT_VALUE : $seed; 
    // rest of the job ... 
} 
+0

不允許將數組作爲常量 –

+3

@JordiMartín直到php> = 5.6您可以使用數組請參閱http://php.net/manual/en/language.constants.syntax.php – donald123

+0

@ donald123是真的!感謝分享。 –

1

我會這樣做。在這種情況下,你只能設置那個參數,你想改變

function f($array = null) { 
    $params = array('a' => '1', 'b' => '2'); // default params 
    if ($array) $params = array_replace($params, $array); 
    foreach($params as $k => $v) 
    echo "$k => $v \n"; 
} 

f(); // a => 1 b => 2 
f(array('b' => "new")); // a => 1 b => new 
+0

而不是if($ array){...}使用if(is_array($ array)){...}來避免問題 –