以下代码:
class Type {
}
function foo(Type $t) {
}
foo(null);
运行时失败:
PHP致命错误:传递给foo()的参数1不能为空
为什么不允许像其他语言一样传递null ?
以下代码:
class Type {
}
function foo(Type $t) {
}
foo(null);
运行时失败:
PHP致命错误:传递给foo()的参数1不能为空
为什么不允许像其他语言一样传递null ?
PHP 7.1或更新版本(2016年12月2日发布)
可以使用此语法显式地将变量声明为null
function foo(?Type $t) {
}
这将导致
$this->foo(new Type()); // ok
$this->foo(null); // ok
$this->foo(); // error
所以,如果你想要一个可选参数,你可以遵循约定Type $t = null,而如果你需要一个参数接受null和它的类型,你可以遵循上面的例子。
你可以在这里阅读更多。
PHP 7.0或更高版本
你必须添加一个默认值,比如
function foo(Type $t = null) {
}
这样,就可以给它传递一个空值。
这在手册中关于类型声明的部分中有记录:
如果参数的默认值设置为NULL,则声明可以接受NULL值。
正如前面提到的其他答案一样,这只有在指定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);
从PHP 7.1开始,可以使用可空类型,包括函数返回类型和参数。类型?T可以有指定类型T的值,或者null。
你的函数可以是这样的:
function foo(?Type $t)
{
}
只要您能够使用PHP 7.1,这种表示法就应该优于函数foo(Type $t = null),因为它仍然强制调用者显式地为形参$t指定一个参数。
从PHP 8.0(2020年11月26日发布)开始,您还可以使用可空的联合类型。
这意味着你可以将Type或null作为参数值:
class Type {}
function foo(Type|null $param) {
var_dump($param);
}
foo(new Type()); // ok : object(Type)#1
foo(null); // ok : NULL
阅读更多关于联合类型的信息。
在我的情况下,问题是本机“修剪”函数,不接受null。 让我们假设你有这样的代码:
if (trim($tables) != '')
{
//code
}
PHP8会抛出这个错误;所以如果你正在处理遗留代码,我建议你创建一个自定义的“修剪”函数,就像这个,让它工作得更快。
public function custom_trim(?string $value)
{
return trim($value ?? '') ;
}
我真的很讨厌这个从7.4到8的变化