当可空函数参数为 `null` 时如何使用默认值?

19

当调用以下函数时,在 PHP 7.1 版本中:

private function doStuff(?int $limit = 999) { }

使用以下语法:

doStuff(null);

$limit的值变成了null。因此,可以说$limit的值被显式地设置为null

有没有办法克服这个问题?也就是说,在遇到null值(即缺少值)时,使用默认值,无论它是隐式还是显式的?


我认为你所说的隐式是指在不带参数调用函数dostuff(),这将采用默认值。如果你向函数发送了null值,我不认为它会自动采用默认值,但你仍然可以在函数内部捕获并通过代码设置默认值。 - Paul Karam
在函数代码的第一行添加 if(is_null($limit)) $limit = 999; - Kaddath
2
不要使用参数,而是使用 dostuff();,它将使用函数参数中设置的默认值。 - node_modules
4
您似乎想既拥有蛋糕,又不想吃它...?您明确声明参数为nullable,这意味着您可以传递null作为其值,而不是声明类型或其默认值。而这正是发生的事情。 - deceze
1
是的,在SQL中,NULL有点超出了类型系统。在PHP和许多其他语言中,它只是另一种类型/值。 - deceze
显示剩余9条评论
1个回答

35

PHP没有“如果为空则回退到默认值”的选项。相反,你应该这样做:

private function dostuff(?int $limit = null) {
    // pre-int typehinting I would have done is_numeric($limit) ? $limit : 999;
    $limit = $limit ?? 999;
}

如果你对于执行任务没有明确的值,请确保你要么执行 dostuff() ,要么执行 dostuff(999)

注意:也可以使用反射来获取方法参数的默认值,但那似乎有点过度。

不过这里是如何实现的:

 $m = new ReflectionFunction('dostuff');
 $default = $m->getParameters()[0]->getDefaultValue();
 dostuff($default);

1
更简单的写法:$limit ?? 999 - NikiC
1
@NikiC 确实可以简化。 - apokryfos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接