Risposte:
PHP 7.1 o versioni successive (rilasciato il 2 dicembre 2016)
È possibile dichiarare esplicitamente una variabile in base null
a questa sintassi
function foo(?Type $t) {
}
questo comporterà
$this->foo(new Type()); // ok
$this->foo(null); // ok
$this->foo(); // error
Quindi, se si desidera un argomento facoltativo, è possibile seguire la convenzione, Type $t = null
mentre se è necessario fare in modo che un argomento accetti entrambinull
e il suo tipo, è possibile seguire l'esempio sopra.
Puoi leggere di più qui .
PHP 7.0 o precedente
Devi aggiungere un valore predefinito come
function foo(Type $t = null) {
}
In questo modo, puoi passargli un valore nullo.
Questo è documentato nella sezione del manuale relativa alle dichiarazioni di tipo :
La dichiarazione può essere fatta per accettare
NULL
valori se il valore predefinito del parametro è impostato suNULL
.
function foo(Type $t)
è una cosa MOLTO buona; vedi riferimenti Null: L'errore di miliardi di dollari
A partire da PHP 7.1, sono disponibili tipi nullable , sia come tipi di ritorno della funzione che parametri. Il tipo ?T
può avere valori del Tipo specificato T
o null
.
Quindi, la tua funzione potrebbe apparire così:
function foo(?Type $t)
{
}
Non appena puoi lavorare con PHP 7.1, questa notazione dovrebbe essere preferita function foo(Type $t = null)
, perché costringe ancora il chiamante a specificare esplicitamente un argomento per il parametro $t
.
Come altre risposte già menzionate, questo è possibile solo se specificato null
come valore predefinito.
Ma la soluzione orientata agli oggetti più pulita e sicura per i tipi sarebbe un 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)';
}
}
Uso:
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
a scavalcare i metodi astratti, anche se non hanno significato (per definizione di null
).
if (something is null)
controlli, poiché NullObject è destinato a coprire tutto il comportamento di un valore inesistente e qualsiasi collaboratore esterno non dovrebbe essere interessato a se un l'oggetto è inesistente (null) o no.