Passando una serie di parametri rispetto a singoli parametri a una function in PHP?

Quando c'è una function che richiede il passaggio di un certo numero di parametri, ad esempio sette parametri, qual è la pratica migliore:

function foo($par1, $par2, $par3, $par4, $par5, $par6, $par7) { } 

o

 function foo(arrays $args) { } 

Dove nel secondo esempio $args sarebbe un arrays con i parametri come elementi.

Ho usato in modo incoerente entrambi i methods.

Lo svantaggio di usare il primo metodo è che se si ottiene un errore nell'sorting di un parametro, si è fregati (e potrebbe essere molto difficile eseguire il debug perché non è sempre ovvio). Questo è il vantaggio dell'uso del metodo arrays.

Il vantaggio (IMHO) di usare il primo tipo è che un buon editor PHP come PhpStorm ti mostrerà i nomi dei parametri mentre stai scrivendo la function, il che è più facile che andare alla function per vedere quali parametri devono essere passati in un arrays.

Apprezzo il tuo consiglio.

Teoricamente, each parametro dovrebbe comprendere un insieme logico. Le raccolte intendono rappresentare una raccolta di valori, non un aggregato di parametri di metodo; i singoli parametri dovrebbero essere passati separatamente per indicare chiaramente lo scopo del metodo.

In pratica, quando si passano i parametri in un arrays, è necessario eseguire una tonnellata di controlli manuali per assicurarsi che siano passati i parametri corretti. È ansible evitare praticamente qualsiasi ambiguità fornendo i propri parametri chiari, nomi logici (e typehints ove ansible). Inoltre, come già affermato in un commento, se un metodo richiede 7 parametri, è probabilmente maturo per alcuni refactoring.

Modifica: se il tuo metodo / function accetta un insieme di "opzioni" vagamente definite che influiscono su ciò che il codice fa solo in minima parte, considera l'utilizzo del componente OptionsResolver di Symfony, per facilitare notevolmente la validation dell'arrays di opzioni.

Penso che questa domanda si riduce a "Quanto forte è digitato php?" o "Quanto forte digitato voglio le mie cose?"

Ovvio, l'arrays è il più liberamente accoppiato. Il numero di variables e il loro nome sono completi fino al chiamante.

La tua chiamata con i parametri separati è un po 'più forte accoppiata, quindi ci deve essere alless il numero di parametri da fornire.

IMHO hai dimenticato un tipo di chiamata, e questo è il type hinting . Questo è il modo più forte di scrivere forte che php, in questo momento, fornisce.

esempio:

 function foo(\MyNamespace\MyObject $par1, \YourNamespace\YourObject $par2) { } 

La mia opinione: con il mio background in sole lingue dattiloscritte, preferisco un forte typed hinting . Ci sono voci secondo cui php 5.5 o php 6 supporteranno anche scalari come suggerimento di tipo.

Se hai molte opzioni basate su argomenti o vuoi maggiore flessibilità prova func_get_args() .

 function foo() { $arg_list = func_get_args(); for ($i = 0; $i < $numargs; $i++) { echo "Argument $i is: " . $arg_list[$i] . "<br />\n"; } } 

Se si desidera limitare gli argomenti accettabili, la definizione delle variables è la migliore.