如何解决如果传入 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 举报,一经查实,本站将立刻删除。