Ist es möglich, benannte Funktionsparameter in PHP zu verwenden? [duplicate]

Lesezeit: 6 Minuten

Benutzer-Avatar
Justin

Ist es möglich in php wie in python Benannte Funktionsparameter haben? Ein beispielhafter Anwendungsfall ist:

function foo($username = "", $password = "", $timeout = 10) {

}

Ich möchte überschreiben $timeout:

foo("", "", 3);

Hässlich. Ich mache viel lieber:

foo(timeout=3);

  • 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

Benutzer-Avatar
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

Benutzer-Avatar
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:

function foo($parms=[]) {
    $username = $parms['username'] ?? '…';
    $password = $parms['password'] ?? '…';
    $timeout  = $parms['timeout'] ?? '…';
}

foo(['timeout'=>10]);

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.

Wie funktioniert es?

Angenommen, Sie haben eine Funktion definiert:

function foo($a = 10, $b = 20, $c = 30) {
    return $a * $b - $c;
}

Sie können diese Funktion jetzt wie folgt aufrufen:

foo(a: 30, c: 10, b: 5);
foo(5, c: 60, b: 10);
foo(c: 30, b: 20, a: 10);

  • NICHT FÜR MICH ARBEITET. DANKE. // öffentliche Funktion getPaginatedRecords($queryObject = ”, $currentPage = 1, $limit = 10){}. // $this->getPaginatedRecords(queryObject: $user_data, currentPage: 1, limit: 10);

    – Kamlesh

    30. Mai 2021 um 13:06 Uhr

Benutzer-Avatar
Chemaklasse

Benannte Argumente werden in nicht unterstützt PHP 7.* oder niedriger.

ABER, es kommt wahrscheinlich dazu PHP 8 https://wiki.php.net/rfc/named_params

Mal sehen, wie es die Abstimmungsphase beendet! 😀

AKTUALISIERT: Der RFC wurde genehmigt. Benannte Argumente werden in PHP 8 implementiert.

Sie sollten eine andere Parameterreihenfolge verwenden

foo($timeout=3,$username="",$password='')

oder denken Sie über die Verwendung nach

func_get_args

  • 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

1227880cookie-checkIst es möglich, benannte Funktionsparameter in PHP zu verwenden? [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy