当调用以下函数时,在 PHP 7.1 版本中:
private function doStuff(?int $limit = 999) { }
使用以下语法:
doStuff(null);
$limit
的值变成了null
。因此,可以说$limit
的值被显式地设置为null
。
有没有办法克服这个问题?也就是说,在遇到null值(即缺少值)时,使用默认值,无论它是隐式还是显式的?
当调用以下函数时,在 PHP 7.1 版本中:
private function doStuff(?int $limit = 999) { }
使用以下语法:
doStuff(null);
$limit
的值变成了null
。因此,可以说$limit
的值被显式地设置为null
。
有没有办法克服这个问题?也就是说,在遇到null值(即缺少值)时,使用默认值,无论它是隐式还是显式的?
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);
$limit ?? 999
- NikiC
dostuff()
,这将采用默认值。如果你向函数发送了null
值,我不认为它会自动采用默认值,但你仍然可以在函数内部捕获并通过代码设置默认值。 - Paul Karamif(is_null($limit)) $limit = 999;
。 - Kaddathdostuff();
,它将使用函数参数中设置的默认值。 - node_modulesnull
作为其值,而不是声明类型或其默认值。而这正是发生的事情。 - decezeNULL
有点超出了类型系统。在PHP和许多其他语言中,它只是另一种类型/值。 - deceze