使用types提示时不能传递null参数
以下代码:
<?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) { }
这样,你可以传递一个空值。
这在手册中有关types声明的部分有logging:
如果参数的默认值设置为
NULL
则可以使声明接受NULL
值。
从PHP 7.1 (2016年12月2日发布)中,您可以显式声明一个variables为null
function foo(?Type $t) { }
这将导致
$this->foo(new Type()); // ok $this->foo(null); // ok $this->foo(); // error
所以,如果你想要一个可选的参数,你可以遵循约定Type $t = null
而如果你需要使一个参数接受null
和它的types,你可以按照上面的例子。
你可以在这里阅读更多。
尝试:
function foo(Type $t = null) { }
检查PHP函数参数 。
正如已经提到的其他答案,这是唯一可能的,如果你指定null
作为默认值。
但最清洁的types安全的面向对象的解决scheme将是一个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);
从PHP 7.1开始,可以使用可为空的types ,既可以是函数返回types,也可以是参数。 types?T
可以具有指定的typesT
值,或者为null
。
所以,你的function可能是这样的:
function foo(?Type $t) { }
只要你能使用PHP 7.1,这个表示法应该优先于function foo(Type $t = null)
,因为它仍然强制调用者显式地为参数$t
指定参数。