PHP übergabe array an Funktion
Ich habe gesehen, ein paar Leute Fragen, eine ähnliche Frage. Aber ich brauche ein wenig mehr Klarheit in dieses Besondere Thema.
Habe ich mehrere Funktionen, die passieren mehrere Argumente. Ich habe sogar ein paar, die sind über 10 Argumente. (war anfangs nicht plan ist es, einfach wuchs im Laufe der Zeit)
Habe ich keine Probleme, an meinem Quell-code herauszufinden, was das 7. argument ist, aber ist es nicht langweilig. Die meisten der Zeit, ich weiß, welche Argumente übergeben werden, nur nicht die position.
Ich hatte ein paar Ideen, um den Prozess zu vereinfachen für mich.
a) pass 1 argument, aber teilen alles mit einigen Trennzeichen. (aber das ist eine schlechte Idee!, da ich noch an merken Sie sich die position der einzelnen.
function myfunc('data|data|data|'){
//explode the string
}
b) übergeben Sie ein array mit Schlüssel und Werte, und suchen Sie nach der wichtigsten Namen innerhalb der Funktion, und entsprechend handeln.
function myfunc(array('arg1' => 'blah blah', 'arg2' => 'more blah')){
//loop through the array
}
c) halten Sie es wie es ist.
function myfunc($arg1,$arg2,$arg3,$arg4,$arg5........){
//yay
}
So, ich bin auf der Suche nach anderen Optionen-und bessere Ideen für die Handhabung von Funktionen mit wachsendem argument Listen.
- was sind das für Funktionen und was sind das für Argumente? wahrscheinlich ist es eine Folge von schlechter Bauart und Anzahl der Parameter deutlich reduziert werden.
- Während es in der aktuellen Ausgabe die Frage ist absolut sinnlos und subjektiv.
- Warum nicht umgestalten von code und teilen Sie Ihre Funktion in mehrere andere? Warum nicht verwenden Sie Objekte und geben Sie diese an andere Objekte? Mit etwa 10 Argumente sollte eine rote fahne, von schlechtem design.
Du musst angemeldet sein, um einen Kommentar abzugeben.
b) (ein assoziatives array) ist bei weitem die einfachste, die meisten adaptible (da Sie es ermöglicht die Simulation von Standard-keyword-Argumenten), und am wenigsten fehleranfällige Variante.
Meiner Meinung nach, der beste Weg, um es durch übergeben ein assoziatives array. So sehen Sie sofort, was jedes argument bedeutet. Nur sicher sein, Sie zu benennen deskriptiv, nicht
arg1
&arg2
.Ein weiterer Vorteil ist ein assoziatives array ist, dass Sie nicht haben, um sich über die Reihenfolge, in der die Argumente übergeben werden in.
Nur daran erinnern, dass, wenn Sie ein assoziatives array verwenden, verlieren Sie die PHP-native Art und Weise der Zuordnung von default-Werten, z.B.:
So, was Sie tun müssen ist, erstellen Sie Ihren eigenen Satz von Standard-Optionen, und dann verschmelzen Sie Ihre arrays:
array_merge_recursive
. Allerdingsarray_merge
funktioniert der trick (wie+=
), und ich habe aktualisiert mein Antwort.array_merge_recursive
?array_merge_recursive
Niederlagen der Zweck. Schauen Sie sich meine Beispiele vonarray_merge_recursive
undarray_merge
, und sagen Sie mir, selbst das macht mehr Sinn.gehen mit der
myfunc($options)
form, wenn viele optionale Parameter, die gemischt werden können und abgestimmt. Verwendenarray_merge_recursive
mit einem Standard array der Optionen, und Sie werden golden.Zunächst sehen, wenn Sie können introduce Parameter object. Es nicht necesseary ersetzen alle 7 Parameter, aber vielleicht senken Sie Ihre Zählung.
Als Nächstes untersuchen Sie die Funktion selbst - warum braucht es so viele Parameter, vielleicht ist es macht einfach zu viel Dinge? Ist Ersetzen Sie den parameter mit der Methode /Replace parameter with explicit-Methode anwendbar?
Durch die Art und Weise, die Umgestaltung ist wunderbar zu Lesen!
Je nach der Absicht, die Funktion, manchmal ist es angebracht, ein Objekt übergeben.
Lasst uns nicht reden über die Lösung #1. Sie schon sagen, dass es schlecht ist...
Mir gefällt die zweite Idee, die übergabe in diesem hash/assoziatives array. Es fühlt sich rubylike 🙂
Die Sache, die Sie tun, ist, dass Sie aufgeben, einige Prüfungen, die Sie erhalten würden, für frei. Wenn Sie eine Funktion aufrufen und vergessen, ein argument, die Laufzeit beschwert, und die Skript-Ausführung beendet.
In deinem Szenario würden Sie tun, alle diese Kontrollen innerhalb Ihrer Funktion: Sind alle notwendigen Optionen gegeben? Sind die Werte der rechten Typen, etc?
Ich würde sagen, die Entscheidung ist bis zu Ihrem Geschmack, wenn es Ihnen nur am code arbeitet.
Wenn andere mit Ihnen zu arbeiten, würde ich Sie bitten, über Ihre Meinung. Bis dahin, würde ich stick mit dem klassischen Ansatz, dass die Funktion mit 7 Argumente
Assoziatives array mit dem Schlüssel als Namen der parameter, Reihenfolge zählt nicht (nicht zu vergessen die Dokumentation, die Tasten sind zu erwarten):
Manchmal werden Sie wollen, stellen Sie sicher, dass Sie löschen Sie alle unwichtigen Schlüssel aus der input-als auch. Eine nützliche Funktion ist
array_intersect_key
Docs.überprüfen Sie diese post über das erstellen einer Ellipse in PHP.
Erstellen einer Ellipse in PHP
Mit den begrenzten Informationen, ich würde sagen, dass halten Sie es wie es ist. Der Grund dafür ist, dass die Funktion Signatur zeigt, dass keines Ihrer Argumente default-Werte (es sind alle erforderlich).
Wenn Sie machen es ein assoziatives array, anschließend entfernen Sie den parser die Fähigkeit zu warnen, Kranken-Funktionen aufgerufen, d.h.:
IDEs kann mit Hilfe der Funktion Aufruf von Hilfe, wenn Sie Schwierigkeiten haben, erinnern Sie alle, die Argumente.
Grundsätzlich, wenn Sie ein argument benötigt, sollte es in der Funktionssignatur.