【问题标题】:php function get default value if null is passed如果传递null,则php函数获取默认值
【发布时间】:2021-10-05 22:39:11
【问题描述】:

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

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

一些额外信息:我正在使用 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);

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

【问题讨论】:

  • 您的意思是您希望$person-&gt;greet(null) 给出与$person-&gt;greet()$person-&gt;greet('Hello') 相同的结果?
  • 如果参数为null则直接覆盖:if ($greeting === null) ....
  • @ZoliSzabó 这正是我想要的 ;)
  • @wayneOS 我不想这样,所以我正在寻找不同的方式,但感谢您的回答。
  • null 与省略具有默认值的参数不同,所以不,您不能在语言级别执行此操作。请参阅下面的@Bart 答案。这是你能得到的最接近的值。

标签: php laravel function default-value


【解决方案1】:

这样的?

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

【讨论】:

  • 我知道我可以这样做,但这不是我想要的。我一直在寻找一种不同的方法来做到这一点,但从 cmets 的外观来看,没有办法做到这一点。所以我会在我的课堂上创建一些额外的设置器并让它们来处理。不过感谢您的回答。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

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

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 2023-03-24
        • 2015-07-26
        • 2018-06-20
        • 2020-07-29
        • 1970-01-01
        • 2013-04-12
        • 2013-05-12
        • 2017-11-26
        • 2020-11-23
        相关资源
        最近更新 更多