Respostas:
PHP 7.1 ou mais recente (lançado em 2 de dezembro de 2016)
Você pode declarar explicitamente uma variável como null
esta sintaxe
function foo(?Type $t) {
}
isso resultará em
$this->foo(new Type()); // ok
$this->foo(null); // ok
$this->foo(); // error
Portanto, se você deseja um argumento opcional, pode seguir a convenção, Type $t = null
enquanto que, se precisar fazer um argumento, aceita ambos null
e seu tipo, pode seguir o exemplo acima.
Você pode ler mais aqui .
PHP 7.0 ou mais antigo
Você precisa adicionar um valor padrão como
function foo(Type $t = null) {
}
Dessa forma, você pode transmitir um valor nulo.
Isso está documentado na seção do manual sobre declarações de tipo :
A declaração pode ser feita para aceitar
NULL
valores se o valor padrão do parâmetro é definido comoNULL
.
function foo(Type $t)
é MUITO bom; veja nulos Referências: A Billion Dollar Mistake
A partir do PHP 7.1, tipos anuláveis estão disponíveis, pois os tipos e parâmetros de retorno de função. O tipo ?T
pode ter valores do tipo especificado T
, ou null
.
Portanto, sua função pode ficar assim:
function foo(?Type $t)
{
}
Assim que você pode trabalhar com o PHP 7.1, essa notação deve ser preferida function foo(Type $t = null)
, porque ainda força o chamador a especificar explicitamente um argumento para o parâmetro $t
.
Como outras respostas já mencionadas, isso só é possível se você especificar null
como o valor padrão.
Mas a solução mais limpa e orientada a objetos com segurança de tipo seria um 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 substituir métodos abstratos, mesmo que eles não tenham significado (por definição de null
).
if (something is null)
verificações, pois o NullObject destina-se a cobrir todo o comportamento de um valor inexistente e qualquer colaborador externo não deve estar interessado em saber se um O objeto não existe (nulo) ou não.