给定类:
<?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((
我期望它以与顶级版本相同的方式工作,因为我的理解是,如果左手边是真实的,则归还左手,否则归还右手。 那么,如果左手是假的,为什么右手在跑呢? 有人可以解释一下吗?
鉴于第二个版本不起作用,顶级版本是最简洁的吗?
来自 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()
null值上运行另一个方法呢?你不能,这就是你收到错误的原因。
保持代码的可读性和简单性并没有错。您可能希望存储初始方法调用值,因此不必再次调用它来运行getGender()
。
$guest = $bar->getGuest();
$gender = ($guest === null) ? null : $guest->getGender();