【问题标题】:Shorthand ternary operator PHP - Call to a member function on null速记三元运算符 PHP - 在 null 上调用成员函数
【发布时间】:2023-03-29 09:01:01
【问题描述】:

给定班级:

<?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()

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

第二个版本不行,是不是上个版本最简洁?

【问题讨论】:

  • 第一个例子不能正常工作——只是你被保护免受错误,因为条件永远不会解析为真,因此三元条件的左侧永远不会运行。 getGender() 不是null 的方法,这是getGuest() 返回的。
  • 对不起,为了这个问题,我做了一点简化,实际上,有一种情况 getGuest 不为空,getGuest()-&gt;getGender() 运行良好。但如果 getGuest 为 null,那么我想返回 NULL
  • 所以请更新问题以包含所有相关代码,包括getGuest()getGender() 的完整定义。

标签: php conditional-operator


【解决方案1】:

From the PHP manual:

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

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

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

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

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

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


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

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

【讨论】:

  • 啊,是的,当然,左手为空时会是假的,所以它会尝试运行右手!我对语法不熟悉,谢谢。在这种情况下,顶级版本仍然是最简洁的(PHP 7.4)吗?
猜你喜欢
  • 1970-01-01
  • 2017-12-06
  • 2012-02-11
  • 1970-01-01
  • 2014-05-17
  • 2015-10-26
  • 2016-05-22
  • 2016-09-17
相关资源
最近更新 更多