为可为空的函数参数提供“null”时如何使用默认值?

Posted

技术标签:

【中文标题】为可为空的函数参数提供“null”时如何使用默认值?【英文标题】:How to use default value when `null` is given for a nullable function parameter? 【发布时间】:2018-01-01 09:16:48 【问题描述】:

php 7.1 中调用以下函数时:

private function doStuff(?int $limit = 999)  

语法如下:

doStuff(null);

$limit 的值变为null。所以我猜可以说$limit的值被显式设置为null

有什么办法可以克服吗? IE。当遇到空值(即缺少值)时,使用默认值,无论是隐式还是显式?

【问题讨论】:

我认为隐含的意思是在没有参数的情况下调用函数dostuff(),这将采用默认值,如果你将null值发送给函数,我认为它不会自己取默认值,但你仍然可以在函数内部捕获它并通过代码设置默认值。 只需在函数代码的第一行添加if(is_null($limit)) $limit = 999; 不要使用参数,而是使用 dostuff(); 它将使用您在函数参数中设置的默认值 你好像想要你的蛋糕却不吃它……?您将参数显式声明为可为空,这意味着您可以将null 作为其值而不是声明的类型或其默认值 传递。这正是发生的事情。 是的,SQL 中的NULL 有点在类型系统之外发挥作用。在 PHP 和许多其他语言中,它只是另一种类型/值。 【参考方案1】:

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

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 确实可以简化。

以上是关于为可为空的函数参数提供“null”时如何使用默认值?的主要内容,如果未能解决你的问题,请参考以下文章

如何将字符串解析为可为空的 int

退出构造函数时,不可为空的属性必须包含非空值。考虑将属性声明为可为空

将可为空的 DateTime 字段更新为 null 会导致默认 DateTime 值 (0001-01-01 00:00:00.0000000)

在 clickhouse 中,使用强制转换函数时如何为可为空的列返回 null

c# nullable double to actionscript NaN through fluorine gateway

如何从数据库中获取可为空的 DateTime