2012-09-25 3 views
5

Wenn es eine Funktion, die eine Anzahl von Parametern erfordert, übergeben, wie sieben Parameter, die die bessere Praxis ist:Übergeben Array von Parametern im Vergleich zu einzelnen Parametern zu einer Funktion in PHP?

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

oder

function foo(array $args) 
{ 
} 

Wo im zweiten Beispiel würde $args ein Array mit den Parametern als Elemente.

Ich habe beide Methoden inkonsistent verwendet.

Der Nachteil der Verwendung der ersten Methode ist, dass, wenn Sie die Reihenfolge eines Parameters falsch erhalten, Sie sind (und es könnte wirklich schwer zu debuggen sein, weil es nicht immer offensichtlich ist). Dies ist der Vorteil der Verwendung der Array-Methode.

Der Vorteil (IMHO) der Verwendung des ersten Typs ist, dass ein guter PHP-Editor wie PHPStorm Ihnen die Namen der Parameter zeigt, während Sie die Funktion eingeben, was einfacher ist als die Funktion zu sehen, welche Parameter müssen in einem Array übergeben werden.

Schätzen Sie Ihren Rat.

+0

was für Sie im Rahmen des Projekts funktioniert. –

+0

Wenn Sie eine Funktion mit 7 Parametern haben, hat sie wahrscheinlich zu viele Verantwortlichkeiten. –

Antwort

4

Theoretisch sollte jeder Parameter ein logisches Ganzes umfassen. Sammlungen sollen eine Sammlung von Werten darstellen, keine Aggregation von Methodenparametern; Die einzelnen Parameter sollten getrennt weitergegeben werden, um den Zweck der Methode deutlich zu machen.

Praktisch, wenn Parameter in einem Array übergeben werden, müssen Sie eine Menge manuelle Prüfungen durchführen, um sicherzustellen, dass die richtigen Parameter übergeben wurden. Sie können so gut wie jede Zweideutigkeit vermeiden, indem Sie Ihren Parametern klare, logische Namen (und Typhinten, wo möglich) geben. Wie bereits erwähnt, ist es wahrscheinlich reif für ein Refactoring, wenn eine Methode 7 Parameter benötigt.

Edit: wenn Ihre Methode/Funktion tut eine Reihe von nicht näher definierten „Optionen“ zu akzeptieren, dass der Code beeinflussen, was funktioniert nur zu einem geringen Teil, betrachten die Symfony OptionsResolver Komponente verwendet wird, zu stark die Validierung Ihrer Optionen zu erleichtern Array.

0

Wenn Sie viele Optionen basierend auf Argumenten haben oder mehr Flexibilität wünschen, versuchen Sie 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"; 
    } 
} 

Wenn Sie akzeptable Argumente eingrenzen möchten, dann ist die Definition von Variablen am besten.

1

Ich denke, diese Frage läuft auf "Wie stark typisiert ist PHP?" oder "Wie stark getippt soll ich meine Sachen haben?"

Offensichtlich ist das Array am lockersten gekoppelt. Die Anzahl der Variablen und deren Namen ist bis zum Aufrufer vollständig.

Ihr Aufruf mit den separaten Parametern ist ein wenig stärker gekoppelt, so dass mindestens die Anzahl der Parameter zur Verfügung gestellt werden muss.

IMHO haben Sie eine Art des Aufrufs vergessen, und das ist mit type hinting. Das ist die stärkste Art der starken Typisierung, die php in diesem Moment bietet.

Beispiel:

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

Meine Meinung: mit meinem Hintergrund in nur stark typisierten Sprachen, ziehe ich es stark typisierte typed hinting. Es gibt Gerüchte, dass PHP 5.5 oder PHP 6 auch Skalare als Typhinweis unterstützen wird.