使用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指定参数。