Können Sie mir bitte sagen, wie das heißt? ?string
und string
Anwendungsbeispiel:
public function (?string $parameter1, string $parameter2) {}
Ich wollte etwas darüber lernen, aber ich kann sie weder in der PHP-Dokumentation noch in Google finden. Was ist der Unterschied zwischen ihnen?
Was ist ein Nullable-Typ?
Eingeführt in PHP 7.1,
Typdeklarationen für Parameter und Rückgabewerte können jetzt als nullable gekennzeichnet werden, indem dem Typnamen ein Fragezeichen vorangestellt wird. Dies bedeutet, dass neben dem angegebenen Typ auch NULL als Argument übergeben bzw. als Wert zurückgegeben werden kann.
Bei Parametern
function test(?string $parameter1, string $parameter2) {
var_dump($parameter1, $parameter2);
}
test("foo", "bar");
test(null, "foo");
test("foo", null); // Uncaught TypeError: Argument 2 passed to test() must be of the type string, null given,
Mit vielfältigen Argumenten
In diesem Beispiel können Sie bestehen null
oder string
Parameter:
function acceptOnlyStrings(string ...$parameters) { }
function acceptStringsAndNull(?string ...$parameters) { }
acceptOnlyStrings('foo', null, 'baz'); // Uncaught TypeError: Argument #2 must be of type string, null given
acceptStringsAndNull('foo', null, 'baz'); // OK
Rückgabetyp
Der Rückgabetyp einer Funktion kann auch ein Nullable-Typ sein und ermöglicht die Rückgabe null
oder der angegebene Typ.
function error_func(): int {
return null ; // Uncaught TypeError: Return value must be of the type integer
}
function valid_func(): ?int {
return null ; // OK
}
function valid_int_func(): ?int {
return 2 ; // OK
}
Eigenschaftstyp (ab PHP 7.4)
Der Typ einer Eigenschaft kann ein Nullable-Typ sein.
class Foo
{
private object $foo = null; // ERROR : cannot be null
private ?object $bar = null; // OK : can be null (nullable type)
private object $baz; // OK : uninitialized value
}
Siehe auch :
Nullfähige Union-Typen (ab PHP 8.0)
Ab PHP 8, “?T
Notation wird als Abkürzung für den üblichen Fall von angesehen T|null
“
class Foo
{
private ?object $bar = null; // as of PHP 7.1+
private object|null $baz = null; // as of PHP 8.0
}
Fehler
Falls die laufende PHP-Version niedriger als PHP 7.1 ist, wird ein Syntaxfehler ausgegeben:
Syntaxfehler, unerwartetes ‘?’, erwartete Variable (T_VARIABLE)
Die ?
Betreiber sollte entfernt werden.
PHP7.1+
function foo(?int $value) { }
PHP 7.0 oder niedriger
/**
* @var int|null
*/
function foo($value) { }
Verweise
Ab PHP7.1: Nullfähiger Typ :
Ab PHP7.4: Typdeklarationen von Klasseneigenschaften.
Ab PHP 8.0: Nullable Union Type
Das Fragezeichen vor dem string
in Ihrem Funktionsparameter bezeichnet a Nullable-Typ. In deinem obigen Beispiel $parameter1
Muss darf eine haben NULL
Wert, während $parameter2
ist nicht; es muss eine gültige Zeichenfolge enthalten.
Parameter mit einem Nullable-Typ haben keinen Standardwert. Wenn er weggelassen wird, ist der Wert standardmäßig nicht null und führt zu einem Fehler:
Funktion f(?aufrufbar $p) { }
F(); // ungültig; Funktion f hat keinen Standardwert
Das bedeutet, dass das Argument als der angegebene Typ oder NULL übergeben werden darf:
http://php.net/manual/en/migration71.new-features.php
Dies entspricht in etwa
public function (string $parameter1 = null, string $parameter2) {}
Außer dass das Argument immer noch erforderlich ist und ein Fehler ausgegeben wird, wenn das Argument weggelassen wird.
Speziell in diesem Zusammenhang ist das zweite Argument erforderlich und wird verwendet =null
würde das erste optional machen, was nicht wirklich funktioniert. Sicher, es funktioniert, aber was ich meine, ist, dass es nicht wirklich optional ist, was der Hauptzweck von Standardwerten ist.
Also verwenden
public function (?string $parameter1, string $parameter2) {}
Syntaktisch macht es in diesem Fall etwas mehr Sinn.