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