php - 速记三元运算符 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()
我期待它以与顶级版本相同的方式工作,因为我的理解是,第二个版本是,如果左侧是真实的,则返回左侧,否则返回右侧。那么,如果左手是假的,为什么右手会跑呢?有人可以解释一下吗?
鉴于第二个版本不起作用,顶级版本是最简洁的吗?
解决方案
从 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();
推荐阅读
- matlab - MATLAB:尽管有权限,但文件标识符无效
- owin - Owin selfhost - 不允许来自外部机器的连接
- istio - 如何根据来自 JWT 声明的组设置 Istio RBAC?
- android - SSL 固定和证书固定有什么区别?
- javascript - 如何以角度将JSON传递给@Input?
- unity3d - 将 Vuforia 添加到现有 Hololens 项目
- multithreading - javafx 多线程不运行 Webengine 命令
- angular - 安装较旧的角度版本 5?
- python - Python :0 被附加到字符串
- ruby-on-rails - 在 rails 过滤器中给出条件