首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP8?> in IF语句

PHP8?> in IF语句
EN

Stack Overflow用户
提问于 2022-09-21 02:43:15
回答 1查看 86关注 0票数 0

在旧的PHP中,IF语句编写为

代码语言:javascript
复制
if ($a && $a->b()) {
    ...
}

上面的内容可以用PHP8编写为

代码语言:javascript
复制
if ($a?->b()) {
    ...
}

一个类的方法可以简单地(没有方程)作为

代码语言:javascript
复制
$a?->b();

而不是

代码语言:javascript
复制
if ($a) {
    $a->b();
}
EN

回答 1

Stack Overflow用户

发布于 2022-09-21 10:00:52

这两种说法在技术上并不等同,但可能是有意的。

?->操作符名为无空算子,它专门检查左侧的。如手册中所述:

其效果类似于首先在is_null() check中包装每个访问,但更紧凑。

因此,以下所有内容都是等价的

代码语言:javascript
复制
if (is_null($a) && $a->b()) {
    echo 'here';
}

if ($a === null && $a->b()) {
    echo 'here';
}

if ($a?->b()) {
    echo 'here';
}

然而,这并不完全是您所写的;您“在布尔上下文中”使用了$a,这意味着您正在检查的只是它是“真实的”或“不为空的”。为了证明这一点,请考虑:

代码语言:javascript
复制
$a = false;
if ($a && $a->b()) {
    echo 'here';
}

在这里,现有代码将快捷,但空安全运算符不会。完整的意图版本可能如下所示:

代码语言:javascript
复制
$a = true;
if ($a instanceof SomeClass && $a->b()) {
    echo 'here';
}

实际上,您可能已经知道$a要么是正确的对象,要么是null (例如,它对参数或属性传递了?SomeClass类型约束),在这种情况下,?->无明文安全运算符意味着您不再需要额外的检查。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73794823

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档