微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如果传入 null,php 函数获取默认值

如何解决如果传入 null,php 函数获取默认值

我目前正在将一个值(可能为 null)传递给具有该参数认值的函数。我预计如果参数为空,它将返回认值。但情况似乎并非如此。 现在我想知道是否有办法解决这个问题?

我知道我可以检查值是否为空,并且当它是时不要传递它,但我不想在我的代码中有太多的 if。如果认值为空,我只想要一种干净的方法获取认值。

一些额外信息:我使用的是 Laravel 框架 8 - 也许 Laravel 中的一些不错的功能我还不知道。

示例code

<?PHP

class Person {
    private $name;
    
    public function greet(string $greeting = 'Hello')
    {
        return sprintf('%s %s',$greeting,$this->name);
    }
    
    public function setName($name)
    {
        $this->name = $name;
        return $this;
    }
}

$externalInput = null;

$person = (new Person())->setName('Maik');
echo $person->greet($externalInput);

这只是一个示例代码,所以不要介意这可能带来的安全问题。这在我的真实代码中都得到了照顾。这段代码只是为了说明我遇到的问题。

解决方法

类似的东西?

public function greet(string $greeting = null){
      return sprintf('%s %s',($greeting ?: 'Hello'),$this->name);
}
,

我建议在greet函数中使用三元运算符,例如 -

public function greet($greeting = null) {
   $greeting = isset($greeting) ? $greeting : 'Hello';
   return sprintf('%s %s',$greeting,$this->name);
}
,

我不认为你可以做你想做的事。我理解您的问题,但 NULL 至少在 PHP 中是一个相对常见且有效的值,可能会被传递,因此它将被视为正确的值,而不是缺失的参数。我通过 unset()tting $externalInput 试了一下,但这给出了预期的未定义变量结果。

查看您的评论,您可能已经知道这一点,但解决方案是在 PHP 中的默认参数值成为现实之前,只使用“旧方法”。如果 0'' 也不是有效值,您可以通过将 $greeting === null!$greeting 交换使其更好。请注意,我通过添加 $greeting 使 ? 参数成为可空字符串。

    public function greet(?string $greeting = null)
    {
        if ($greeting === null) {
            $greeting = 'Hello';
        }
        return sprintf('%s %s',$this->name);
    }

Edit:: Named arguments,new in PHP 也可能是一个更好的解决方案。只要 key=>vals 是 paramName=>paramVal 对,似乎您就可以传递一个 splatted 数组 myFunc(...$arr) 。然后,您可以过滤整个数组并一次性删除所有 NULL 值,而无需为每个单独的参数使用这些 if(isNull) 之一。

,

与其他答案相同,但更短一些(使用 Null 合并运算符):

public function greet(?string $greeting = null)
{
    return sprintf('%s %s',$greeting ?? 'Hello',$this->name);
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。