OK, ich habe völlig vergessen, wie man Argumente in PHP überspringt.
Nehmen wir an, ich habe:
function getData($name, $limit = '50', $page = '1') {
...
}
Wie würde ich diese Funktion aufrufen, damit der mittlere Parameter den Standardwert annimmt (dh '50')?
getData('some name', '', '23');
Wäre das oben richtig? Ich kann das scheinbar nicht zum Laufen bringen.
php
function
parameters
default-value
optional-parameters
Chuck Le Butt
quelle
quelle
ReflectionFunction
. Ich habe diese Antwort in einer ähnlichen Frage gepostet .Antworten:
Dein Beitrag ist korrekt.
Wenn Sie einen optionalen Parameter ganz am Ende der Parameterliste verwenden müssen, müssen Sie leider alles bis zu diesem letzten Parameter angeben. Wenn Sie mischen und anpassen möchten, geben Sie ihnen im Allgemeinen Standardwerte von
''
odernull
und verwenden sie nicht innerhalb der Funktion, wenn es sich um diesen Standardwert handelt.quelle
$limit = is_numeric($limit) ? $limit : '50';
am Anfang der getData- FunktionEs gibt keine andere Möglichkeit, ein Argument zu "überspringen", als einen Standardwert wie
false
oder anzugebennull
.Da es in PHP an syntaktischem Zucker mangelt, werden Sie häufig Folgendes sehen:
Wie in den Kommentaren eloquent gesagt, werden Arrays verwendet, um benannte Argumente zu emulieren.
Dies bietet ultimative Flexibilität, ist jedoch in einigen Fällen möglicherweise nicht erforderlich. Zumindest können Sie alles, was Ihrer Meinung nach die meiste Zeit nicht erwartet wird, an das Ende der Argumentliste verschieben.
quelle
Nein, es ist nicht möglich, Argumente auf diese Weise zu überspringen. Sie können nur übergebene Argumente weglassen dann wenn sie sich am Ende der Parameterliste befinden.
Hierfür gab es einen offiziellen Vorschlag: https://wiki.php.net/rfc/skipparams , der abgelehnt wurde. Die Vorschlagseite enthält Links zu anderen SO-Fragen zu diesem Thema.
quelle
Es hat sich nichts geändert, was das Überspringen optionaler Argumente betrifft, jedoch für die korrekte Syntax und die Angabe von NULL für Argumente, die ich überspringen möchte. So würde ich es machen:
Dies kann so aufgerufen werden:
getData('some name',NULL,'23');
und jeder, der die Funktion in Zukunft aufruft, muss sich nicht jedes Mal an die Standardeinstellungen oder die für sie deklarierte Konstante erinnern.quelle
Die einfache Antwort lautet Nein . Aber warum überspringen, wenn die Argumente neu angeordnet werden, um dies zu erreichen?
Ihre ist eine " falsche Verwendung von Standardfunktionsargumenten " und funktioniert nicht so, wie Sie es erwarten.
Eine Randnotiz aus der PHP-Dokumentation:
Folgendes berücksichtigen:
Die Ausgabe wird sein:
Die korrekte Verwendung von Standardfunktionsargumenten sollte folgendermaßen aussehen:
Die Ausgabe wird sein:
Wenn Sie die Standardeinstellung nach den Nicht-Standardeinstellungen rechts setzen, wird sichergestellt, dass der Standardwert für diese Variable immer neu abgestimmt wird, wenn sie nicht definiert / angegeben ist. Hier ist ein Link als Referenz und woher diese Beispiele stammen.
Bearbeiten: Wenn Sie es
null
so einstellen, wie es andere vorschlagen, funktioniert es möglicherweise und ist eine andere Alternative, passt aber möglicherweise nicht zu Ihren Wünschen. Der Standardwert wird immer auf null gesetzt, wenn er nicht definiert ist.quelle
Für jeden übersprungenen Parameter (Sie müssen) gehen Sie mit dem Standardparameter, um auf der sicheren Seite zu sein.
(Wenn Sie sich für null entscheiden, wenn der Standardparameter '' oder ähnlich ist oder umgekehrt, geraten Sie in Schwierigkeiten ...)
quelle
Wie oben erwähnt, können Sie keine Parameter überspringen. Ich habe diese Antwort geschrieben, um einen Nachtrag zu liefern, der zu groß war, um ihn in einen Kommentar aufzunehmen.
@Frank Nocke schlägt vor , die Funktion mit ihren Standardparametern aufzurufen, also zum Beispiel mit
du solltest benutzen
Dies entspricht funktional dem Weglassen der ersten beiden (
$b
und$c
) Parameter.Es ist nicht klar, welche
0
Standardeinstellungen sind (wird eingegeben, um den Standardwert bereitzustellen, oder ist es wichtig?).Es besteht auch die Gefahr, dass das Problem mit den Standardwerten mit der externen (oder integrierten) Funktion verbunden ist, wenn die Standardwerte vom Autor der Funktion (oder Methode) geändert werden können. Wenn Sie also Ihren Aufruf im Programm nicht ändern würden, könnten Sie sein Verhalten unbeabsichtigt ändern.
Eine Problemumgehung könnte darin bestehen, einige globale Konstanten zu definieren, z.
DEFAULT_A_B
B. "Standardwert des B-Parameters der Funktion A" und "Auslassen" der folgenden Parameter:Für Klassen ist es einfacher und eleganter, wenn Sie Klassenkonstanten definieren, da diese Teil des globalen Bereichs sind, z.
Beachten Sie, dass diese Standardkonstante im gesamten Code genau einmal definiert wird (selbst in der Methodendeklaration gibt es keinen Wert). Bei unerwarteten Änderungen geben Sie der Funktion / Methode daher immer den korrekten Standardwert an.
Die Klarheit dieser Lösung ist natürlich besser als rohen Standardwert liefert (wie
NULL
,0
etc.) , die nichts zu einem Leser sagen.(Ich bin damit einverstanden, dass ein Anruf wie
$var = a(,,'ddd');
die beste Option wäre)quelle
Sie können keine Argumente überspringen, aber Sie können Array-Parameter verwenden und Sie müssen nur 1 Parameter definieren, bei dem es sich um ein Array von Parametern handelt.
Und Sie können so viele Parameter hinzufügen, wie Sie benötigen, Sie müssen sie nicht definieren. Wenn Sie die Funktion aufrufen, geben Sie Ihre Parameter folgendermaßen ein:
quelle
Wie alle anderen bereits gesagt haben, ist das, was Sie wollen, in PHP nicht möglich, ohne dass der Funktion Codezeilen hinzugefügt werden.
Sie können diesen Code jedoch oben in eine Funktion einfügen, um Ihre Funktionalität zu erhalten:
Also im Grunde mit
debug_backtrace()
bekomme ich den Funktionsnamen, in den dieser Code gestellt wird, um dann einen neuen zu erstellenReflectionFunction
Objekt und alle Funktionsargumente zu durchlaufen.In der Schleife überprüfe ich einfach, ob das Funktionsargument
empty()
AND ist und das Argument "optional" ist (bedeutet, dass es einen Standardwert hat). Wenn ja, weise ich dem Argument einfach den Standardwert zu.Demo
quelle
Setzen Sie das Limit auf null
und rufen Sie diese Funktion auf
Wenn Sie das Limit festlegen möchten, können Sie es als Argument übergeben
quelle
Wie bereits erwähnt , hat sich nichts geändert. Beachten Sie jedoch, dass zu viele Parameter (insbesondere optionale) ein starker Indikator für den Codegeruch sind.
Vielleicht macht Ihre Funktion zu viel:
Einige Parameter können logisch gruppiert werden:
Als letztes Mittel können Sie immer ein Ad-hoc- Parameterobjekt einführen :
(Dies ist nur eine verherrlichte Version der weniger formalen Parameter-Array- Technik. )
Manchmal ist der Grund, einen Parameter optional zu machen, falsch. Soll in diesem Beispiel
$page
wirklich optional sein? Macht das Speichern einiger Zeichen wirklich einen Unterschied?quelle
Dieser Ausschnitt:
Antwort ist :
quelle
Das würde ich tun:
Hoffe das wird jemandem helfen
quelle
Dies ist eine Art alte Frage mit einer Reihe technisch kompetenter Antworten, aber sie verlangt nach einem der modernen Entwurfsmuster in PHP: Objektorientierte Programmierung. Anstatt eine Sammlung primitiver skalarer Datentypen zu injizieren, sollten Sie ein "injiziertes Objekt" verwenden, das alle von der Funktion benötigten Daten enthält. http://php.net/manual/en/language.types.intro.php
Das injizierte Objekt verfügt möglicherweise über Routinen zur Überprüfung von Eigenschaften usw. Wenn die Instanziierung und Injektion von Daten in das injizierte Objekt nicht die gesamte Validierung bestehen kann, kann der Code sofort eine Ausnahme auslösen und die Anwendung kann den umständlichen Prozess des Handels vermeiden mit möglicherweise unvollständigen Daten.
Wir können das injizierte Objekt tippen, um Fehler vor der Bereitstellung abzufangen. Einige der Ideen sind in diesem Artikel von vor einigen Jahren zusammengefasst.
https://www.experts-exchange.com/articles/18409/Using-Named-Parameters-in-PHP-Function-Calls.html
quelle
Ich musste eine Factory mit optionalen Parametern erstellen. Meine Problemumgehung bestand darin, den Null-Koaleszenz-Operator zu verwenden:
Verwendung:
Nicht das Schönste, aber möglicherweise ein gutes Muster für Tests in Fabriken.
quelle
Versuche dies.
quelle
Sie können den mittleren Parameter in Ihrem Funktionsaufruf nicht überspringen. Aber Sie können damit umgehen:
Funktion:
quelle
Wie @IbrahimLawal betonte. Es wird empfohlen, sie nur auf
null
Werte zu setzen. Überprüfen Sie einfach, ob der übergebene Wert der ist,null
in dem Sie Ihre definierten Standardeinstellungen verwenden.Hoffe das hilft.
quelle
Übergeben Sie sie einfach nicht und der Standardwert wird akzeptiert
quelle