Невозможно передать нулевой аргумент при использовании типа hinting

Следующий код:

<?php class Type { } function foo(Type $t) { } foo(null); ?> 

не удалось во время выполнения:

 PHP Fatal error: Argument 1 passed to foo() must not be null 

Почему не разрешено передавать null так же, как и другие языки?

Related of "Невозможно передать нулевой аргумент при использовании типа hinting"

Вы должны добавить значение по умолчанию, например

 function foo(Type $t = null) { } 

Таким образом, вы можете передать ему нулевое значение.

Это описано в разделе руководства по объявлениям типа :

Объявление может быть принято, чтобы принимать значения NULL если значение по умолчанию для параметра установлено равным NULL .

Из 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.1 доступны типы с нулевым значением , как типы возвращаемых функций, так и параметры. Тип ?T может иметь значения указанного типа T или null .

Таким образом, ваша функция может выглядеть так:

 function foo(?Type $t) { } 

Как только вы сможете работать с PHP 7.1, это обозначение должно быть предпочтительнее function foo(Type $t = null) , поскольку оно все еще вынуждает вызывающего явно указывать аргумент для параметра $t .

Пытаться:

 function foo(Type $t = null) { } 

Проверьте аргументы функции PHP .

Как уже упоминалось, это можно сделать только в том случае, если в качестве значения по умолчанию указано значение 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);