Ответы:
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 предназначен для охвата всего поведения несуществующего значения, и любой сторонний соавтор не должен интересоваться, является ли объект не существует (ноль) или нет.