Es ist seit PHP 8 verfügbar: stackoverflow.com/a/64072408/7082164
– Jsowa
25. September 2020 um 23:34 Uhr
Matt S
PHP 8.0 hat Unterstützung für benannte Argumente mit der Akzeptanz von hinzugefügt ein RFC.
Benannte Argumente werden übergeben, indem dem Wert der Parametername gefolgt von einem Doppelpunkt vorangestellt wird. Die Verwendung von reservierten Schlüsselwörtern als Parameternamen ist erlaubt. Der Parametername muss ein Bezeichner sein, eine dynamische Angabe ist nicht erlaubt.
Um beispielsweise nur den 3. optionalen Parameter in Ihrem Beispiel zu übergeben:
foo(timeout: 3);
Vor PHP 8 waren benannte Parameter in PHP nicht möglich. Technisch gesehen, wenn Sie anrufen foo($timeout=3) es wertet aus $timeout=3 zunächst mit einem Ergebnis von 3 und das als ersten Parameter an übergeben foo(). Und PHP erzwingt die Parameterreihenfolge, also müsste der vergleichbare Aufruf sein foo("", "", $timeout=3). Sie haben zwei weitere Möglichkeiten:
Lassen Sie Ihre Funktion ein Array als Parameter annehmen und überprüfen Sie die Array-Schlüssel. Ich persönlich finde das hässlich, aber es funktioniert und ist lesbar. Der Vorteil ist die Einfachheit und es ist einfach, später neue Parameter hinzuzufügen. Der Nachteil ist, dass Ihre Funktion weniger selbstdokumentierend ist und Sie nicht viel Hilfe von IDEs erhalten (Autovervollständigung, schnelle Suche nach Funktionsparametern usw.).
Richten Sie die Funktion ohne Parameter ein und fragen Sie PHP mit nach den Argumenten func_get_args() oder verwenden Sie die ...Funktion für Argumente mit variabler Länge in PHP 5.6+. Basierend auf der Anzahl der Parameter können Sie dann entscheiden, wie jeder behandelt werden soll. Viele JQuery-Funktionen machen so etwas. Dies ist einfach, kann aber für diejenigen, die Ihre Funktionen aufrufen, verwirrend sein, da es auch nicht selbstdokumentierend ist. Und Ihre Argumente sind immer noch nicht benannt.
Ein Hoch auf die Zuordnungstechnik aus einem Ästhetik-Pov. Es gibt nur einen Nachteil, es sieht sehr nach benannten Parametern aus (ähm, das ist der Punkt, nein?). Aber das könnte den Eindruck erwecken, dass die Reihenfolge keine Rolle mehr spielt, obwohl sie es tatsächlich tut. Ich nehme an, dass ein Teil davon nicht so selbstdokumentierend ist. Um Ihre Antwort zu korrigieren, können Sie technisch gesehen nur Folgendes tun: foo( '', '', $timeout = 3 );
– Benutzer1115652
21. Dezember 2014 um 6:04 Uhr
PS: Es gibt einige andere kleinere Nachteile: Leistung (wird selten ein Problem sein) und möglicherweise vorhandene Variablen überschreiben. Alles in allem der Vorteil gegenüber foo( '', '', 3 /*timeout*/ ); ist fraglich.
– Benutzer1115652
21. Dezember 2014 um 6:11 Uhr
Sie sollten dies wahrscheinlich für PHP8 aktualisieren. Benannte Argumente werden unterstützt.
– Jakob Thomason
25. September 2020 um 3:13 Uhr
@JacobThomason Aktualisiert, danke. Ich werde es erneut aktualisieren, nachdem PHP8 veröffentlicht wurde.
– Matt S
29. September 2020 um 15:20 Uhr
FYI, Entpacken eines assoziativen Arrays mit ... (dh foo(...["timeout"=>3])) ist auch eine Option. Es könnte vor 8.0 verfügbar gewesen sein, aber ich bin mir nicht sicher. Idk, wenn es erwähnenswert ist
– Joe Boris
9. Februar um 4:34
Manngo
Alte Frage, aber hier sind ein paar mehr Informationen.
Wie in den anderen Antworten angegeben, unterstützt PHP benannte Parameter nicht direkt. VBA ist eine andere Sprache, die diesen Luxus hat.
In PHP können Sie einen ziemlich vernünftigen Ersatz verwenden. Die Handhabung von Arrays in PHP ist besonders gut, und Sie können ein assoziatives Array verwenden, um ein Array von Parametern wie folgt zu übergeben:
Beachten Sie die Verwendung von ?? -Operator, um einen einfachen Standardwert zuzulassen, wenn das Eingabe-Array-Element nicht vorhanden ist. Vor PHP 7 würden Sie verwenden ?: was subtil anders ist, aber in diesem Fall das gleiche Ergebnis liefert. Danke an @LeeGee für das Aufgreifen.
Nicht so schick, aber benannte Parameter haben eine weitere wichtige Rolle: Sie ermöglichen es Ihnen, mit einer großen Anzahl von Optionen ohne eine übermäßig lange Liste geordneter Parameter zu arbeiten.
Eine alternative Möglichkeit, die Funktion zu schreiben, ist die Verwendung der `Extract-Funktion:
function foo($parms=[]) {
$username="…";
$password = '…';
$timeout="…";
extract($parms,EXTR_IF_EXISTS);
}
Hier die extract Die Funktion kopiert die Werte in die Variablen, aber nur, wenn sie bereits definiert wurden. Dies verhindert das Importieren von Variablen, von denen Sie nichts wussten.
Aktualisierte Antwort für 2020: PHP 8 wird benannte Argumente unterstützen, der RFC wurde übergeben.
Was bedeutet das?
Sowohl native Funktionen als auch Ihr aktueller Code können benannte Parameter verwenden.
Ich denke, es ist eine allgemeine Frage, die er dazu stellt, nicht in diesem einen speziellen Fall.
– Fluffeh
1. Oktober 2013 um 22:15 Uhr
Timeout gehört aber nicht zuerst, nur sehr seltsames Verhalten, der Standard ist Benutzername, Passwort.
– Justin
1. Oktober 2013 um 22:15 Uhr
Also, wenn Sie Ihre ursprüngliche Bestellung möchten – dann müssen Sie func_get_args verwenden – sie zählen und sie dann auf die Variablen setzen, die Sie benötigen, in anderen Fällen – wie würde PHP wissen, dass das Timeout, das Sie übergeben, nicht ist der Nutzername ?
– Axel
1. Oktober 2013 um 22:17 Uhr
Wie Python es macht: foo(timeout=3). Ok, schätze, ich muss Dirty verwenden func_get_args().
– Justin
1. Oktober 2013 um 22:20 Uhr
Ich denke, es ist eine allgemeine Frage, die er dazu stellt, nicht in diesem einen speziellen Fall.
– Fluffeh
1. Oktober 2013 um 22:15 Uhr
Timeout gehört aber nicht zuerst, nur sehr seltsames Verhalten, der Standard ist Benutzername, Passwort.
– Justin
1. Oktober 2013 um 22:15 Uhr
Also, wenn Sie Ihre ursprüngliche Bestellung möchten – dann müssen Sie func_get_args verwenden – sie zählen und sie dann auf die Variablen setzen, die Sie benötigen, in anderen Fällen – wie würde PHP wissen, dass das Timeout, das Sie übergeben, nicht ist der Nutzername ?
– Axel
1. Oktober 2013 um 22:17 Uhr
Wie Python es macht: foo(timeout=3). Ok, schätze, ich muss Dirty verwenden func_get_args().
– Justin
1. Oktober 2013 um 22:20 Uhr
12278800cookie-checkIst es möglich, benannte Funktionsparameter in PHP zu verwenden? [duplicate]yes
So etwas könnte für Sie funktionieren. Es ist jedoch keine große visuelle Verbesserung … stackoverflow.com/questions/1620737/…
– Paul Nachtisch
1. Oktober 2013 um 22:17 Uhr
Ich habe eine Frage/Antwort als Lösung auf stackoverflow.com/questions/56415163 geteilt
– Behnam
2. Juni 2019 um 12:46 Uhr
das wird in möglich sein php8.
– Mrten
16. September 2020 um 9:24 Uhr
Es ist seit PHP 8 verfügbar: stackoverflow.com/a/64072408/7082164
– Jsowa
25. September 2020 um 23:34 Uhr