Wie würde ich optionale Argumente in einem Funktionsaufruf überspringen?

Lesezeit: 7 Minuten

OK, ich habe total 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 obiges richtig? Ich kann das anscheinend nicht zum Laufen bringen.

  • @Chuck nach was suchst du genau? Wie eine Problemumgehung oder eine Klasse, um dies zu implementieren, oder …?

    – Rizier123

    15. Mai 2015 um 20:10 Uhr

  • @ Rizier123 Ich frage, ob die aktuelle Version von PHP das Überspringen von Argumenten unterstützt (wie es andere Sprachen tun). Die aktuellen Antworten können veraltet sein. Aus der Bounty-Beschreibung: “Aktuelle Antworten sind fünf Jahre alt. Ändert die aktuelle Version von PHP etwas?”

    – Chuck Le Butt

    19. Mai 2015 um 9:29 Uhr


  • @Chuck Dann wird die Antwort wahrscheinlich lauten: dass sich nichts geändert hat; ohne Workaround/Code erhalten Sie Ihre Funktionalität nicht.

    – Rizier123

    19. Mai 2015 um 9:41 Uhr

  • Alle Antworten hier scheinen davon auszugehen, dass Sie die Kontrolle über die aufgerufene Funktion haben. Wenn diese Funktion Teil einer Bibliothek oder eines Frameworks ist, haben Sie keine andere Wahl, als etwas für Argument 2 anzugeben, wenn Sie Argument 3 benötigen. Die einzige Möglichkeit besteht darin, in der Quelle nach der Funktion zu suchen und den Standardwert zu replizieren.

    – Snapey

    25. Februar 2017 um 14:27 Uhr


  • Es ist nicht möglich, es zu überspringen, aber Sie können das Standardargument mit übergeben ReflectionFunction. Ich habe diese Antwort in einer ähnlichen Frage gepostet.

    – David

    16. Oktober 2018 um 17:59 Uhr


Dein Beitrag ist richtig.

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 '' oder nullund verwenden Sie sie nicht innerhalb der Funktion, wenn sie dieser Standardwert sind.

  • Können Sie ein Beispiel nennen?

    – Ich bin ich

    16. Dezember 2015 um 22:42 Uhr

  • @iamme $limit = is_numeric($limit) ? $limit : '50'; am Anfang von Daten bekommen Funktion

    – Kamafeder

    20. November 2018 um 13:01 Uhr

Wie wurde ich optionale Argumente in einem Funktionsaufruf uberspringen
Paolo Bergantino

Es gibt keine andere Möglichkeit, ein Argument zu “überspringen”, als einen Standard wie anzugeben false oder null.

Da PHP diesbezüglich etwas syntaktischer Zucker fehlt, werden Sie oft so etwas sehen:

checkbox_field(array(
    'name' => 'some name',
    ....
));

Was, wie in den Kommentaren eloquent gesagt wird, Arrays verwendet, um benannte Argumente zu emulieren.

Dies bietet ultimative Flexibilität, ist aber in einigen Fällen möglicherweise nicht erforderlich. Zumindest können Sie alles, was Ihrer Meinung nach meistens nicht erwartet wird, an das Ende der Argumentliste verschieben.

  • Ich würde “so etwas” als “Verwenden von Arrays zum Emulieren benannter Argumente” identifizieren, FWIW. 🙂

    – Chaos

    30. Juni 2009 um 23:52 Uhr

  • Obwohl Sie flexibler sind, müssen Sie sich die Parameter merken, die Sie einstellen sollten/können (da sie nicht in der Signatur stehen). Am Ende ist es vielleicht nicht so nützlich, wie es scheint, aber das hängt natürlich vom Kontext ab.

    – Felix Klinge

    7. Januar 2010 um 10:03 Uhr

  • Was wären also die Best Practices für ein solches Szenario?

    – Adam Grant

    8. Mai 2012 um 19:56 Uhr

Wie wurde ich optionale Argumente in einem Funktionsaufruf uberspringen
Cristik

Nein, es ist nicht möglich, Argumente auf diese Weise zu überspringen. Sie können übergebene Argumente weglassen nur wenn sie am Ende der Parameterliste stehen.

Dazu gab es einen offiziellen Vorschlag: https://wiki.php.net/rfc/skiparams, die abgelehnt wurde. Die Vorschlagsseite enthält Links zu anderen SO-Fragen zu diesem Thema.

  • Wie haben PHP-Funktionen dann optional mehr/weniger Parameter?

    – Ich bin ich

    16. Dezember 2015 um 22:46 Uhr

  • PHP unterstützt Standardparameterwerte. Aber diese Parameter müssen am Ende der Liste stehen.

    – Kritik

    17. Dezember 2015 um 8:03 Uhr

  • Beispiele finden Sie in der PHP-Dokumentation

    – Kritik

    18. Dezember 2015 um 8:03 Uhr

  • Idioten. Macht mich so wütend. Wenn Ihnen eine Funktion, die jemand anderes anfordert, nicht gefällt, verwenden Sie sie einfach nicht. Das Internet ist manchmal das Schlimmste.

    – Lee Saxon

    16. Januar 2017 um 7:11 Uhr

  • @LeeSaxon Das Problem ist Lesbarkeit und Portabilität. 1) Wenn jemand beschließt, Parameter zu überspringen, und jemand, der Code debuggt, diese Tatsache übersieht, entsteht große Verwirrung. 2) Neuer Code könnte ohne eine umfassende Überarbeitung nicht auf älteren Versionen funktionieren, und die Wahrscheinlichkeit von Fehlern wäre sehr hoch.

    – Mark Walsh

    10. Januar 2020 um 19:01 Uhr

Wie wurde ich optionale Argumente in einem Funktionsaufruf uberspringen
Ibrahim Lawal

An der Möglichkeit, optionale Argumente zu überspringen, hat sich nichts geändert, aber für die korrekte Syntax und um NULL für Argumente angeben zu können, die ich überspringen möchte, würde ich es folgendermaßen machen:

define('DEFAULT_DATA_LIMIT', '50');
define('DEFAULT_DATA_PAGE', '1');

/**
 * getData
 * get a page of data 
 *
 * Parameters:
 *     name - (required) the name of data to obtain
 *     limit - (optional) send NULL to get the default limit: 50
 *     page - (optional) send NULL to get the default page: 1
 * Returns:
 *     a page of data as an array
 */

function getData($name, $limit = NULL, $page = NULL) {
    $limit = ($limit===NULL) ? DEFAULT_DATA_LIMIT : $limit;
    $page = ($page===NULL) ? DEFAULT_DATA_PAGE : $page;
    ...
}

Das kann man so nennen: getData('some name',NULL,'23'); und jeder, der die Funktion in Zukunft aufruft, muss sich nicht jedes Mal an die Standardwerte oder die für ihn deklarierte Konstante erinnern.

1646353451 890 Wie wurde ich optionale Argumente in einem Funktionsaufruf uberspringen
Nelson Owalo

Die einfache Antwort ist Nein. Aber warum überspringen, wenn die Argumente neu angeordnet werden, um dies zu erreichen?

Deins ist ein “Falsche Verwendung von Standardfunktionsargumenten” und wird nicht so funktionieren, wie Sie es erwarten.

Eine Randnotiz aus der PHP-Dokumentation:

Wenn Sie Standardargumente verwenden, sollten alle Standardwerte auf der rechten Seite aller Nicht-Standardargumente stehen; Andernfalls funktionieren die Dinge nicht wie erwartet.

Folgendes berücksichtigen:

function getData($name, $limit="50", $page="1") {
    return "Select * FROM books WHERE name = $name AND page = $page limit $limit";
}

echo getData('some name', '', '23');   // won't work as expected

Die Ausgabe wird sein:

"Select * FROM books WHERE name = some name AND page = 23 limit"

Die korrekte Verwendung von Standardfunktionsargumenten sollte wie folgt aussehen:

function getData($name, $page="1", $limit="50") {
    return "Select * FROM books WHERE name = $name AND page = $page limit $limit";
}

echo getData('some name', '23');  // works as expected

Die Ausgabe wird sein:

"Select * FROM books WHERE name = some name AND page = 23 limit 50"

Wenn Sie den Standardwert rechts hinter die Nicht-Standardwerte setzen, wird sichergestellt, dass der Standardwert für diese Variable immer wieder eingestellt wird, wenn sie nicht definiert/angegeben ist. Hier ist a Verknüpfung als Referenz und woher diese Beispiele stammen.

Edit: Einstellung auf null wie andere vorschlagen, könnte funktionieren und ist eine weitere Alternative, entspricht aber möglicherweise nicht Ihren Wünschen. Es wird den Standardwert immer auf null setzen, wenn er nicht definiert ist.

  • Dies ist die beste Antwort, da sie klar illustrierte syntaktische Erklärungen enthält! Danke!

    – Christian

    16. Juli 2019 um 5:34 Uhr

1646353452 823 Wie wurde ich optionale Argumente in einem Funktionsaufruf uberspringen
Frank Nocke

Für jeden übersprungenen Parameter (müssen Sie) gehen Sie mit dem Standardparameter, um auf der sicheren Seite zu sein.

(Wenn Sie sich mit null zufrieden geben, wo der Standardparameter ” oder ähnlich oder umgekehrt ist, werden Sie in Schwierigkeiten geraten …)

  • Dies ist die beste Antwort, da sie klar illustrierte syntaktische Erklärungen enthält! Danke!

    – Christian

    16. Juli 2019 um 5:34 Uhr

1646353453 887 Wie wurde ich optionale Argumente in einem Funktionsaufruf uberspringen
Gemeinschaft

Wie oben erwähnt, können Sie keine Parameter überspringen. Ich habe diese Antwort geschrieben, um einen Nachtrag bereitzustellen, der zu groß war, um ihn in einen Kommentar aufzunehmen.

@Frank Nocke schlägt vor, die Funktion mit ihren Standardparametern aufzurufen, also zum Beispiel having

function a($b=0, $c=NULL, $d=''){ //...

du solltest benutzen

$var = a(0, NULL, 'ddd'); 

was funktional dasselbe ist wie das Weglassen der ersten beiden ($b und $c) Parameter.

Es ist nicht klar, welche Standardwerte sind (ist 0 eingegeben, um den Standardwert bereitzustellen, oder ist es wichtig?).

Es besteht auch die Gefahr, dass das Problem der Standardwerte mit externen (oder integrierten) Funktionen verbunden ist, wenn die Standardwerte vom Autor der Funktion (oder Methode) geändert werden könnten. 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, wie z DEFAULT_A_B Dies wäre “Standardwert des B-Parameters der Funktion A” und Parameter auf diese Weise “weglassen”:

$var = a(DEFAULT_A_B, DEFAULT_A_C, 'ddd');

Für Klassen ist es einfacher und eleganter, wenn Sie Klassenkonstanten definieren, da diese Teil des globalen Gültigkeitsbereichs sind, z.

class MyObjectClass {
  const DEFAULT_A_B = 0;

  function a($b = self::DEFAULT_A_B){
    // method body
  }
} 
$obj = new MyObjectClass();
$var = $obj->a(MyObjectClass::DEFAULT_A_B); //etc.

Beachten Sie, dass diese Standardkonstante im gesamten Code genau einmal definiert wird (es gibt keinen Wert, nicht einmal in der Methodendeklaration), sodass Sie im Falle einiger unerwarteter Änderungen die Funktion/Methode immer mit dem richtigen Standardwert angeben.

Die Übersichtlichkeit dieser Lösung ist natürlich besser als die Bereitstellung roher Standardwerte (wie z NULL, 0 usw.), die einem Leser nichts sagen.

(Ich stimme zu, dass das Aufrufen wie $var = a(,,'ddd'); wäre die beste möglichkeit)

929000cookie-checkWie würde ich optionale Argumente in einem Funktionsaufruf überspringen?

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

Privacy policy