首页 > 解决方案 > 速记三元运算符 PHP - 在 null 上调用成员函数

问题描述

给定班级:

<?php
class foo {
    public function getGuest() {
        return new guest();
    }
}

class guest {
    public function getGender() {
        return 'F';
    }
}

我想重构以下工作正常:

$bar->getGuest() ? $bar->getGuest()->getGender() : NULL

到:

$bar->getGuest() ?: $bar->getGuest()->getGender()

我在哪里得到错误:在 null 上调用成员函数 getGender()

我期待它以与顶级版本相同的方式工作,因为我的理解是,第二个版本是,如果左侧是真实的,则返回左侧,否则返回右侧。那么,如果左手是假的,为什么右手会跑呢?有人可以解释一下吗?

鉴于第二个版本不起作用,顶级版本是最简洁的吗?

标签: phpconditional-operator

解决方案


从 PHP 手册

从 PHP 5.3 开始,可以省略三元运算符的中间部分。表达式 expr1 ?:如果 expr1 的计算结果为 TRUE,则 expr3 返回 expr1,否则返回 expr3。

让我们看看您在这里尝试做什么:

$bar->getGuest() ?: $bar->getGuest()->getGender()

其工作方式是,如果第一个$bar->getGuest()表达式等于true,您的操作将返回其$bar->getGuest()自身的值。这应该可以正常工作,没有错误。

但是,如果$bar->getGuest()返回其他内容(例如null),它将运行第三个表达式,即$bar->getGuest()->getGender().

好吧,我们已经确定了$bar->getGuest()返回null,那么你怎么能->getGender()在空值上运行另一个方法呢?你不能,这就是你得到错误的原因。


保持代码的可读性和简单性没有错。您可能想要存储初始方法调用值,因此您不必为了运行而再次调用它getGender()

$guest = $bar->getGuest();
$gender = ($guest === null) ? null : $guest->getGender();

推荐阅读