Ответы:
PHP 7.1 или новее (выпущено 2 декабря 2016 г.)
Вы можете явно объявить переменную nullс этим синтаксисом
function foo(?Type $t) {
}
это приведет к
$this->foo(new Type()); // ok
$this->foo(null); // ok
$this->foo(); // error
Итак, если вам нужен необязательный аргумент, вы можете следовать соглашению, Type $t = nullтогда как если вам нужно, чтобы аргумент принимал оба nullи его тип, вы можете следовать приведенному выше примеру.
Вы можете прочитать больше здесь .
PHP 7.0 или старше
Вы должны добавить значение по умолчанию, как
function foo(Type $t = null) {
}
Таким образом, вы можете передать ему нулевое значение.
Это задокументировано в разделе руководства по объявлениям типов :
Объявление может быть принято для принятия
NULLзначений, если для параметра по умолчанию установлено значениеNULL.
function foo(Type $t)это ОЧЕНЬ хорошо; см. Null References: Ошибка в миллиард долларов
Начиная с PHP 7.1, доступны обнуляемые типы , так как функции возвращают типы и параметры. Тип ?Tможет иметь значения указанного Типа Tили null.
Итак, ваша функция может выглядеть так:
function foo(?Type $t)
{
}
Как только вы сможете работать с PHP 7.1, эта нотация должна быть предпочтительнее function foo(Type $t = null) , потому что она по-прежнему заставляет вызывающую сторону явно указывать аргумент для параметра $t.
Как уже упоминалось в других ответах, это возможно, только если вы укажете nullзначение по умолчанию.
Но самым чистым типобезопасным объектно-ориентированным решением будет 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)';
}
}
Использование:
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переопределять абстрактные методы, даже если они не имеют значения (по определению null).
if (something is null)проверок, так как NullObject предназначен для охвата всего поведения несуществующего значения, и любой сторонний соавтор не должен интересоваться, является ли объект не существует (ноль) или нет.