Antworten:
PHP 7.1 oder neuer (veröffentlicht am 2. Dezember 2016)
Sie können eine Variable explizit für null
diese Syntax deklarieren
function foo(?Type $t) {
}
Dies führt zu
$this->foo(new Type()); // ok
$this->foo(null); // ok
$this->foo(); // error
Wenn Sie also ein optionales Argument wünschen, können Sie der Konvention folgen. Type $t = null
Wenn Sie ein Argument dazu bringen müssen, beide null
und seinen Typ zu akzeptieren , können Sie dem obigen Beispiel folgen.
Sie können mehr lesen hier .
PHP 7.0 oder älter
Sie müssen einen Standardwert wie hinzufügen
function foo(Type $t = null) {
}
Auf diese Weise können Sie einen Nullwert übergeben.
Dies ist im Abschnitt im Handbuch über Typdeklarationen dokumentiert :
Die Deklaration kann so erfolgen, dass
NULL
Werte akzeptiert werden, wenn der Standardwert des Parameters auf gesetzt istNULL
.
function foo(Type $t)
eine SEHR gute Sache; siehe Null Referenzen: Der Milliarden-Dollar-Fehler
Ab PHP 7.1 stehen nullfähige Typen als Funktionsrückgabetypen und Parameter zur Verfügung. Der Typ ?T
kann Werte des angegebenen Typs haben T
, oder null
.
Ihre Funktion könnte also folgendermaßen aussehen:
function foo(?Type $t)
{
}
Sobald Sie mit PHP 7.1 arbeiten können, sollte diese Notation vorgezogen werden function foo(Type $t = null)
, da der Aufrufer dennoch gezwungen ist, explizit ein Argument für den Parameter anzugeben $t
.
Wie bereits erwähnt, ist dies nur möglich, wenn Sie dies angeben null
als Standardwert .
Die sauberste typsichere objektorientierte Lösung wäre jedoch ein NullObject :
interface FooInterface
{
function bar();
}
class Foo implements FooInterface
{
public function bar()
{
return 'i am an object';
}
}
class NullFoo implements FooInterface
{
public function bar()
{
return 'i am null (but you still can use my interface)';
}
}
Verwendung:
function bar_my_foo(FooInterface $foo)
{
if ($foo instanceof NullFoo) {
// special handling of null values may go here
}
echo $foo->bar();
}
bar_my_foo(new NullFoo);
NullFoo
gezwungen, abstrakte Methoden zu überschreiben, obwohl sie (per Definition von null
) keine Bedeutung haben .
if (something is null)
gedacht ist, Überprüfungen zu vermeiden , da das NullObject das gesamte Verhalten eines nicht vorhandenen Werts abdecken soll und kein externer Mitarbeiter daran interessiert sein sollte, ob ein Objekt ist nicht vorhanden (null) oder nicht.