Ich bin verwirrt über die 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 und ein anderes Argument für $ y festlegen möchte?
Ich habe mit verschiedenen Methoden experimentiert und bin nur noch verwirrter. Zum Beispiel habe ich diese beiden ausprobiert:
foo("blah", null, "test");
foo("blah", "", "test");
Beides führt jedoch nicht zu einem richtigen Standardargument für $ x. Ich habe auch versucht, es durch Variablennamen festzulegen.
foo("blah", $x, $y = "test");
Ich habe voll und ganz damit gerechnet, dass so etwas funktioniert. Aber es funktioniert überhaupt nicht so, wie ich es erwartet hatte. Es scheint, als müsste ich, egal was ich tue, die Standardargumente jedes Mal eingeben, wenn ich die Funktion aufrufe. Und mir muss etwas Offensichtliches fehlen.
foo("blah", , "test");
?Antworten:
Ich würde vorschlagen, die Funktionsdeklaration wie folgt zu ändern, damit Sie tun können, was Sie wollen:
Auf diese Weise können Sie einen Aufruf wie folgt tätigen
foo('blah', null, 'non-default y value');
und ihn wie gewünscht arbeiten lassen, wobei der zweite Parameter$x
immer noch seinen Standardwert erhält.Wenn Sie bei dieser Methode einen Nullwert übergeben, möchten Sie den Standardwert für einen Parameter, wenn Sie den Standardwert für einen nachfolgenden Parameter überschreiben möchten.
Wie in anderen Antworten angegeben,
Wenn ich eine Methode habe, die eine unterschiedliche Anzahl von Parametern und Parameter unterschiedlichen Typs akzeptieren kann, deklariere ich die Funktion häufig ähnlich der Antwort von Ryan P.
Hier ist ein weiteres Beispiel (dies beantwortet Ihre Frage nicht, ist aber hoffentlich informativ:
quelle
null
dem Parameter einen realen Wert zuzuweisen , da jedes Mal der Standardwert zugewiesen wird. Selbst wenn Sie einen anderen speziellen Wert hätten, wenn Sie tatsächlich eine Null wollen (z. B. wenn $ x == "use_null" $ x = null macht), könnten Sie keinen solchen speziellen Wert wie den Literalwert von zuweisen Parameter (in diesem Fall die Zeichenfolge "use_null"). Verwenden Sie also unbedingt einen eindeutigen, nie gewünschten "Schlüssel", wenn Sie den Standardwert verwenden möchten (undnull
eine gültige Option sein möchten )Optionale Argumente funktionieren nur am Ende eines Funktionsaufrufs. Es gibt keine Möglichkeit, einen Wert für $ y in Ihrer Funktion anzugeben, ohne auch $ x anzugeben. Einige Sprachen unterstützen dies über benannte Parameter (z. B. VB / C #), jedoch nicht über PHP.
Sie können dies emulieren, wenn Sie ein assoziatives Array für Parameter anstelle von Argumenten verwenden - dh
Rufen Sie dann die Funktion folgendermaßen auf:
quelle
isset($args['x'])
, da sie derzeit eine leere Zeichenfolge, ein leeres Array oderfalse
den Standardwert ersetzen würde .$x = !array_key_exists('x',$args) ? 'default x value' : $args['x'];
Es ist tatsächlich möglich:
Ob du das willst, ist eine andere Geschichte :)
AKTUALISIEREN:
Die Gründe, diese Lösung zu vermeiden, sind:
Aber es kann tatsächlich in Situationen nützlich sein, in denen:
Sie wollen / können die ursprüngliche Funktion nicht ändern.
Sie könnten die Funktion ändern, aber:
null
(oder gleichwertig) ist keine Option (siehe Kommentar von DiegoDD )func_num_args()
In Bezug auf die Leistung zeigt ein sehr einfacher Test , dass die Verwendung der Reflection-API zum Abrufen der Standardparameter den Funktionsaufruf 25-mal langsamer macht , während er immer noch weniger als eine Mikrosekunde dauert . Sie sollten wissen, ob Sie damit leben können.
Wenn Sie es in einer Schleife verwenden möchten, sollten Sie natürlich vorher den Standardwert erhalten.
quelle
quelle
$defaults = [ 'x' => 'some value', 'y' => 'some other value'];
Ich weiß nur, wie ich das mache, indem ich den Parameter weglasse. Die einzige Möglichkeit, den Parameter wegzulassen, besteht darin, die Parameterliste so anzuordnen, dass diejenige, die Sie weglassen möchten, nach den Parametern liegt, die Sie einstellen MÜSSEN . Beispielsweise:
Dann können Sie foo wie folgt aufrufen:
Dies führt zu:
quelle
Ich hatte vor kurzem dieses Problem und fand diese Frage und Antworten. Während die obigen Fragen funktionieren, besteht das Problem darin, dass IDEs, die dies unterstützen (wie PHPStorm), die Standardwerte nicht angezeigt werden.
Wenn Sie verwenden
null
, wissen Sie nicht, wie hoch der Wert wäre, wenn Sie ihn leer lassen.Die Lösung, die ich bevorzuge, besteht darin, den Standardwert auch in die Funktionsdefinition aufzunehmen:
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.
quelle
Sie können dies nicht direkt tun, aber ein wenig Code-Fummeln ermöglicht das Emulieren.
quelle
null
in diesem Fall konzeptionell ordentlicher alsfalse
.false
ist eine riskantere Wahl alsnull
, da PHP eine nicht strenge Sprache ist.!$x
gilt für mehrere verschiedene Eingaben, die den Programmierer überraschen können:0
,''
. Während mitnull
können Sie!isset
als strengeren Test verwenden.quelle
Dies ist der Fall, wenn Objekte besser sind - weil Sie Ihr Objekt so einrichten können, dass es x und y enthält, Standardeinstellungen einrichten usw.
Die Annäherung mit dem Array ist nahe daran, ein Objekt zu erstellen.
Natürlich können Sie immer einige Tricks ausführen, um null oder ähnliches als Standard festzulegen
quelle
Sie können auch überprüfen, ob Sie eine leere Zeichenfolge als Argument haben, damit Sie Folgendes aufrufen können:
foo('blah', "", 'non-default y value', null);
Unterhalb der Funktion:
Es spielt keine Rolle, ob Sie
null
oder füllen""
, Sie erhalten immer noch das gleiche Ergebnis.quelle
Übergeben Sie anstelle einzelner Parameter ein Array an die Funktion und verwenden Sie den Null-Koaleszenz-Operator (PHP 7+).
Unten übergebe ich ein Array mit 2 Elementen. Innerhalb der Funktion überprüfe ich, ob der Wert für item1 festgelegt ist, wenn kein Standardtresor zugewiesen ist.
quelle
$args['item1'] = $args['item1']??'default value';
in PHP 7+ verwenden. Wenn $ args ['item1'] null ist, wird derdefault value
String $ args ['item1'] zugewiesenMeine 2 Cent mit Null-Koaleszenz-Operator
??
(seit PHP 7)Sie können weitere Beispiele auf meiner repl.it überprüfen
quelle