Следующий код:
<?php class Type { } function foo(Type $t) { } foo(null); ?>
не удалось во время выполнения:
PHP Fatal error: Argument 1 passed to foo() must not be null
Почему не разрешено передавать null так же, как и другие языки?
Вы должны добавить значение по умолчанию, например
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);