PHP:空合并运算符的对立面吗?

时间:2019-01-18 16:28:42

标签: php null ternary-operator php-7.1

我经常处于变量可以为objectnull的情况下。

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

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

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

我正在使用PHP 7.1。

3 个答案:

答案 0 :(得分:0)

如果您在用户对象中定义一个__toString()类,并返回ID,则可以使用null合并运算符:

class User
{
    public function __toString()
    {
        return (string) $this->getId();
    }
}

$data['id_user'] = $user ?? null;

这也不会生成任何警告。

但是,如果要使用多个字段,这样做并没有太大帮助。

答案 1 :(得分:0)

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

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

在PHP 8之前,您可以利用自动布尔转换来利用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 :(得分:-1)

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

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

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

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

相关问题