Mit einem assoziativen array als php-Funktion Eingang
Gelegentlich Schreibe ich eine PHP-Funktion mit einem einzigen Eingang, ein assoziatives array mit allen von der Funktion der Eingänge. Dies hat Vorteile wie nicht zu müssen, zu erinnern, die richtige Reihenfolge der Eingänge, aber ich habe auch bemerkt, dass es macht die Umsetzung von änderungen, um große codebase viel einfacher; wenn ich hinzufügen müssen, um eine andere variable, und die variable muss durch 4 oder 5 bereits vorhandenen Funktionen, es ist viel einfacher, wenn ich nur kleben Sie es in das array und Durchlauf es entlang.
Meine Frage ist, ist es ein Nachteil, dies zu tun?
Ich nur selten sehen die Funktionen so geschrieben in den Beispielen, oder in open source, die ich verwenden, das führt mich zu glauben, es ist wahrscheinlich ein Nachteil. Wenn es nicht ein Grund, es nicht zu tun, dann warum schreiben Sie nicht alle Funktionen auf diese Weise?
UPDATE
Danke für all Eure Antworten. Es sieht aus wie zwei große Probleme hervor:
Die Lesbarkeit des Codes - unmöglich zu sagen, welche Variablen in einer Funktion sind, was Sie für
Variable kriechen - Könnte wind-up mit massiven arrays Prellen von einer Funktion zur nächsten; man sollte nicht die übergabe von Parametern an Funktionen, die nicht brauchen, Sie
Sind die beiden großen Punkte, die ich nicht nachdenken.
Es scheint, die Allgemeine Kernaussage ist auch, dass code, wo dies ein Problem ist, muss wohl umgebaut werden zu einer Klasse. Leider wird in diesem Projekt eine solche Umgestaltung ist über das Ziel hinaus, aber ich denke auch, dass Bill Karwin die Lösung ist gut - übergeben Sie ein array von optionalen Variablen
- Aus reinem Interesse, kannst du eine Beispiel-Funktion, die Sie schreiben würde? 🙂
- mehr wie "aus morbider Neugier"? 🙂
- Also statt der Funktion myFunc($var1, $var2, $var3, $var4 ...) {} Sie hätten function myFunc($params) { } und dann die Referenz über $params['var1'], usw
- Wenn du neugierig bist, ist das Konzept der "named Parameter" diskutiert wurde mehrere Male von der PHP-internals-team, aber es war letztlich abgelehnt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Für diese Angelegenheit, warum nicht vergessen, die Parameter vollständig, und verwenden Sie Globale Variablen für alles? (Scherz)
Übergeben ein assoziatives array hat einen nützlichen Vorteil: Sie können mehrere Parameter der Funktion sind optional, und Sie können geben Sie den Wert für die Nth parameter ohne pass-ein Wert für die *N-1*th parameter.
Aber Sie haben keine Möglichkeit, den obligatorischen Parameter mit einer compile-Zeit-Fehler, wenn Sie nicht Sie übergeben. Weder können Sie erklären, type-checking.
Müssen Sie schreiben code innerhalb der aufgerufenen Funktion zum überprüfen auf das Vorhandensein und die Art der erforderlichen Parameter.
Eine alternative, die ich verwendet haben, zu erklären konventionellen Parametern für diejenigen, die vorgeschrieben sind, und dann, als der Letzte (optionale) argument, deklarieren ein assoziatives array namens
$options
enthält nur optionale Elemente.$password
werden der string in der Deklaration der Funktion? Ich nehme an, du meintest zu geben-überprüfen Sie Sie innerhalb der Funktion selbst, richtig?array
oder Klasse-Typen, erklärt der in der argument-Liste (als ich dies schrieb im Jahr 2009, PHP hat nicht ähnliche Typ-Prüfungen in der argument-Liste für Skalare Typen wie string, int, float). Wenn Sie ein $options array, Sie haben zu tun, alle Typ-überprüfung manuell in Ihrer Funktion; Sie können es nicht deklarativ.Der Nachteil ist, dass jeder Blick auf Ihren code (andere als du), würde haben keine Ahnung, welche Parameter in eine Methode, wo Sie herkamen oder was Sie sind, für. Sie würde auch keine Ahnung haben, wie eine Methode aufrufen, da es nicht klar ist, ohne den code anzuschauen, was genau benötigt wird innerhalb dieses "parameter-array".
vermutlich einer der Nachteile ist, dass Sie am Ende mit viel zu viele Parameter.
Dies führt zu dem problem, dass der code wahrscheinlich, es zu verlieren, ist die Lesbarkeit.
In einem streng objektorientierten Ansatz, den Sie umwandeln würden all diese Parameter, die "Durchlaufen" mehrerer-Funktion-Anrufe in die Instanz-Variablen des Klassen halten Methoden.
Sollten Sie niemals die übergabe von Parametern an Funktionen, die eigentlich nicht von Ihnen gewünschten.
function foo($a, $b) { ... }
und nur$b
zählte, von der Anrufer-Sicht, könnten Sie möglicherweise am Ende die übergabe einer unnötigen Wert als ersten parameter in übereinstimmung mit der Funktion Voraussetzung.Dies ist nicht unbedingt schlecht für eine Idee, da PHP fehlt die "keyword-Argumente" - Funktion, die man in vielen anderen modernen Programmiersprachen (Python, Ruby, etc.). Allerdings gibt es definitiv ein paar Probleme mit sich:
Wenn Sie die Parameter ändern, dass Sie eine Funktion übernimmt, dann ist es wahrscheinlich, Sie haben einige Codezeilen ändern, wo es heißt sowieso, um mit den neuen Parametern.
Wenn Sie diese arrays umfassend, und in vielen Funktionsaufrufe, indem Sie eine Reihe und einfach "übergeben Sie es zusammen," das könnte ein Zeichen sein, dass Sie denken darüber nach, einige dieser Parameter in einer strukturierten Klasse.
Wenn Sie mit diesen arrays als eine veränderbare Datenstruktur, die Sie nicht unbedingt wissen, dass das array, das Sie haben nach dem Aufruf der Funktion ist die gleiche wie die, die Sie übergeben. Dies wird wahrscheinlich wieder kommen, um Sie irgendwann.
Auflistung kann jeder parameter erhöhen die Lesbarkeit des Codes. Vorbei an ein einzelnes assoziatives array wäre das nicht unbedingt erklären, welche Art(en) der Daten an eine Funktion übergeben.
Wenn ich wurden, um Ihre Funktion und sehen, dass es einfach beginnt, verweisen auf hash-Werte innerhalb einer Funktion argument, ich wäre ein wenig verwirrt. Explizite Angabe der Variablen und geben ein bisschen Dokumentation in einem docblock mit @param hilft ungemein. Dass Sie ein argument in beiden Orten ist eine kleine Kosten im Vergleich zu der Lesbarkeit listing Argumente ergibt.
Ich persönlich verwenden Sie die folgende Methode:
deklarieren Sie den parameter als array in der definition einer Funktion;
Schaffung eines "default-Werte" assoc. array;
match params übergeben mit der Standard-in eine definitive Parameter assoc.array, dass ich in der Funktion. Für diesen Zweck verwende ich die param_default () - Funktion.
Durch die folgende Methode, die ich vermeiden obligatorisch params Themen und verwalten-default-Werte; auch die Fähigkeit zu übergeben Tasten in beliebiger Reihenfolge ist sehr komfortabel.
Also dies ist ein einfaches Beispiel für die Verwendung:
Beispiel der Ausgabe:
Den größten code smell ist hier, dass das hinzufügen einer weiteren Variablen werden nacheinander über 4-5 verschiedene Funktionen. Ich kann nicht wirklich einen Grund denken, dies würde passieren müssen.
Es klingt wie Sie benötigen, umgestalten, diesen code in eine Klasse, so dass Sie dann übergeben Sie die Werte in einem Konstruktor einer Zeit, und speichern Sie Sie als member-Variablen.
Macht es viel einfacher, um die Dokumentation zu generieren, wenn Sie die Parameter benannt und übergeben getrennt. Man könnte denken, mit einem array macht es einfacher, um neuen code, aber der Kopf es nicht zu schlagen heraus, die Lesbarkeit zu verbessern. Plus Weg von deinem code seit 2 Monaten und kommen zurück...herauszufinden, in welcher Reihenfolge hinzufügen Parameter für Ihr array in welchen Situationen wird eine massive Kopfschmerzen.
In einigen Fällen ist dies jedoch Sinn machen finde ich, aber oft kann man Dinge vereinfachen, indem Sie mehrere Methoden mit leicht abweichenden Verhaltensweisen. Der name der Methode wird dann auch klar machen, was es ist.
In der Regel, wenn Sie Ihre Funktionen haben > 3 Argumente, die es unlesbar werden, sowieso.
Als eine alternative und oft verwendete Muster macht das einzige argument Ihrer Funktion wird ein (klassifiziert-)Objekt. Die "parameter-class" definieren, was genau unterstützt wird.
Wenn jemand noch auf der Suche nach einer Lösung - hier ist Sie (Beispiel-Funktion ist __construct() ):
Extrahieren $_GET/$_POST-Parameter und übergeben Sie an den Konstruktor
wenn Ihr quetion ist, dass, wie man ein array als inputof Funktion, dies ist Ihre Antwort:
Erstellen Sie die Funktion:
Aufruf der Funktion:
Ausgabe: