【问题标题】:PHP: Is there opposite of null coalescing operator?PHP:是否有空合并运算符的对立面?
【发布时间】:2019-06-12 22:50:56
【问题描述】:

我经常遇到变量可以是objectnull 的情况。

当我将数据放入数据库时​​,我必须坚持这样的做法:

// @var User|null $user
$data['id_user'] = $user!==null ? $user->getId() : null;

有什么办法可以缩短这个吗?我知道??,但这有点相反。

我使用的是 PHP 7.1。

【问题讨论】:

  • stackoverflow.com/q/1993409/534109 - 你正在寻找猫王操作员
  • 这在这种情况下不会完全有效,但会吗? Elvis 运算符等效于$user ? $user : null;(因此将分配$user 而不是$user->getId()) - 如果$user 对象本身是null,您不想执行$user->getId() ?: null(因此在null) 上调用方法...嗯嗯嗯。非常感谢。
  • 如果 $user 未定义,Elvis 运算符也会生成 E_NOTICE。
  • 实际上,您现有的代码也会生成 E_NOTICE,您可能应该使用类似:isset($user) ? $user->getId() : null;
  • ^ 或者对于超级谨慎的人来说,isset()is_object()method_exists() ... O_o ... Barmar 的解决方案/hack(取决于视角)看起来更好分钟。

标签: php null ternary-operator php-7.1


【解决方案1】:

从 PHP 8 开始,有 nullsafe operator ?->。有了它,你可以像这样重构你的代码:

// @var User|null $user
$data['id_user'] = $user?->getId();

在 PHP 8 之前,您可以利用自动 bool 转换来利用 when converting to bool, null is considered false 的优势,但其他对象不是(显然从空标签创建的 SimpleXML 对象也被认为是错误的)。因此,您可以将示例缩短为以下内容:

// @var User|null $user
$data['id_user'] = $user ? $user->getId() : null;

但是,由于 ?可能对某些人来说意味着您一开始就使用 bool,或者它可能使读者不得不考虑如何将 null 转换为 bool。您的原始代码更明确,因此可能更具可读性。为了让大脑不那么辛苦,我经常至少考虑尽可能避免使用“不等于”,而直接使用“等于”。所以你可以把你的代码重构成这样:

// @var User|null $user
$data['id_user'] = $user === null ? null : $user->getId();

在这种特殊情况下,我认为这个技巧(避免“不等于”)效果很好,但有时违反直觉,代码仍然更自然地可读,无论如何只使用“不等于”。

【讨论】:

    【解决方案2】:

    如果您在用户对象中定义 __toString() 类,并让它返回 id,那么您可以使用 null 合并运算符:

    class User
    {
        public function __toString()
        {
            return (string) $this->getId();
        }
    }
    
    $data['id_user'] = $user ?? null;
    

    这也不会产生任何警告。

    但是,如果您要处理多个字段,这也无济于事。

    【讨论】:

      【解决方案3】:

      我认为没有一个运营商可以做到这一点。

      最接近的是@ 错误抑制运算符:

      $data['id_user'] = @$user->getId();
      

      如果$user->getId() 出现错误,则错误消息被抑制,值为null

      【讨论】:

        猜你喜欢
        • 2011-02-25
        • 2010-10-03
        • 2011-02-20
        • 2011-06-19
        • 2011-06-26
        • 1970-01-01
        • 2011-09-30
        • 2014-03-10
        相关资源
        最近更新 更多