2015-07-20 23 views
7

Qual è la procedura migliore per definire un valore di default/fallback per un array?Parametro funzione - valore predefinito dell'array | best practice

Descrizione:

La mia funzione accetta 2 parametri. Uno di questi è una serie di opzioni tra cui scegliere. Se non è stata passata l'array, ha un valore di default/fallback come nell'esempio:

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

domande di sostegno:

a) è la memorizzazione riempito matrice in argomenti di default una buona idea ?

b) Quale sarebbe meglio, una costante, array_merge, if(empty...?

+0

Questo dipende dalla situazione, si sono essenzialmente chiedendo che cosa è meglio: la fusione delle matrici o ridefinizione di esso. O ho frainteso? – George

+0

@George Penso che tu abbia capito bene. La domanda principale sarebbe: memorizzare una matrice con valori come parametro di funzione predefinito una buona idea. Se ora - quale soluzione avrebbe funzionato meglio? –

+0

Non c'è niente * errato * con i valori predefiniti nelle definizioni dei parametri, potrebbe solo avere degli svantaggi che non si desidera. Di nuovo, lo scenario specifico. – George

risposta

4

Dal momento che i valori di default sono condivisi con tutti gli oggetti, è meglio decalre loro come static.
Ridurre la visibilità a protected è consigliato

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

vorrei aggiungere if (is_null ($ seed) ** ||! Is_array ($ seed) **) .... ma la soluzione mi ha mandato in aumento da – donald123

+0

@ donald123 lo cambio e lo approverò :), per rimanere coerente dovremmo aggiungere: 'if (is_null ($ seed) ||! is_integer ($ seed))' ... –

0

A mio parere, la memorizzazione dell'array riempito in argomenti predefiniti non è una buona idea. Cosa succede se si chiama la funzione con un array che non ha tutte le chiavi necessarie?

Esempio:

Volete

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

Ora si chiama la funzione di una serie, ma non con i tasti abbastanza. Quindi, a mio parere, array_merge() è la soluzione migliore qui.

1

Meglio passare un array vuoto come argomento.

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

A mio parere, mi passa i valori di matrice direttamente nella funzione

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

O se la matrice è utilizzato in diverse funzioni, lo passo in una classe COSTANTE come questa

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

Gli array non sono consentiti come costanti –

+3

@ JordiMartín fino a php> = 5.6 è possibile utilizzare gli array vedere http://php.net/manual/en/language.constants.syntax.php – donald123

+0

@ donald123 è vero! grazie per la condivisione. –

1

vorrei farlo. In tal caso è possibile impostare solo che params, si desidera modificare

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

Invece di if ($ array) {...} usa se (is_array ($ array)) {...} per evitare problemi –