216 Stimmen

Verwendung von Standardargumenten in einer Funktion

Ich bin verwirrt über Standardwerte für PHP-Funktionen. Angenommen, ich habe eine Funktion wie diese:

function foo($blah, $x = "some value", $y = "some other value") {
    // code here!
}

Was ist, wenn ich das Standardargument für $x verwenden möchte und ein anderes Argument für $y festlegen möchte?

Ich habe mit verschiedenen Möglichkeiten experimentiert und werde nur noch verwirrter. Zum Beispiel habe ich diese beiden versucht:

foo("blah", null, "test");
foo("blah", "", "test");

Aber bei beiden wird kein ordnungsgemäßes Standardargument für $x erzeugt. Ich habe auch versucht, es nach dem Variablennamen zu setzen.

foo("blah", $x, $y = "test");   

Ich hatte erwartet, dass so etwas funktioniert. Aber es funktioniert überhaupt nicht so, wie ich es erwartet habe. Es scheint, als ob ich, egal was ich tue, die Standardargumente beim Aufrufen der Funktion jedes Mal eingeben muss. Und ich muss etwas Offensichtliches übersehen.

4voto

Wes Crow Punkte 2941

Der einzige Weg, den ich kenne, um es zu machen, besteht darin, den Parameter wegzulassen. Der einzige Weg, den Parameter auszulassen, besteht darin, die Parameterliste so umzustellen, dass derjenige, den Sie weglassen möchten, nach den Parametern steht, die Sie setzen müssen. Zum Beispiel:

function foo($blah, $y = "some other value", $x = "some value")

Dann können Sie foo so aufrufen:

foo("blah", "test");

Dies führt zu:

$blah = "blah";
$y = "test";
$x = "some value";

3voto

Yehosef Punkte 17023

Ich hatte kürzlich dieses Problem und fand diese Frage und Antworten. Während die obigen Fragen funktionieren, ist das Problem, dass sie den Standardwerten nicht in IDEs angezeigt werden, die dies unterstützen (wie PHPStorm).

Bildbeschreibung hier eingeben

Wenn Sie null verwenden, wissen Sie nicht, was der Wert wäre, wenn Sie ihn leer lassen.

Die Lösung, die ich bevorzuge, besteht darin, den Standardwert auch in der Funktionsdefinition anzugeben:

protected function baseItemQuery(BoolQuery $boolQuery, $limit=1000, $sort = [], $offset = 0, $remove_dead=true)
{
    if ($limit===null) $limit =1000;
    if ($sort===null) $sort = [];
    if ($offset===null) $offset = 0;
    ...

Der einzige Unterschied ist, dass ich sicherstellen muss, dass sie gleich sind - aber ich denke, das ist ein kleiner Preis für die zusätzliche Klarheit.

3voto

Bram Punkte 71

In PHP 8 können wir benannte Argumente für dieses Problem verwenden.

So könnten wir das Problem lösen, das vom ursprünglichen Fragesteller beschrieben wurde:

Was ist, wenn ich das Standardargument für $x verwenden möchte und ein anderes Argument für $y festlegen möchte?

Mit:

foo(blah: "blah", y: "test");

Referenz: https://wiki.php.net/rfc/named_params (insbesondere der Abschnitt "Skipping defaults")

2voto

kba Punkte 19072

Sie können dies nicht direkt tun, aber durch ein wenig Code-Manipulation ist es möglich, dies nachzuahmen.

function foo($blah, $x = false, $y = false) {
  if (!$x) $x = "einige Wert";
  if (!$y) $y = "einiger anderer Wert";

  // Code
}

1voto

Mustafa Ekici Punkte 138

Sie können auch überprüfen, ob Sie einen leeren String als Argument haben, damit Sie beispielsweise folgendermaßen aufrufen können:

foo('blah', "", 'nicht Standard-Y-Wert', null);

Unterhalb der Funktion:

function foo($blah, $x = null, $y = null, $z = null) {
    if (null === $x || "" === $x) {
        $x = "einiger Wert";
    }

    if (null === $y || "" === $y) {
        $y = "ein anderer Wert";
    }

    if (null === $z || "" === $z) {
        $z = "ein anderer Wert";
    }

    Code hier!

}

Es spielt keine Rolle, ob Sie null oder "" ersetzen, das Ergebnis bleibt dasselbe.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X