为了账号安全,请及时绑定邮箱和手机立即绑定

PHP 中是否有可选链?

PHP 中是否有可选链?

PHP
侃侃尔雅 2022-01-02 16:28:40
我想在链式语句中省略对 null 的检查,例如if($a && $a->$b && $a->$b->$c){  $d = $a->$b->$c;}并改用可选链接。这是可能的还是在 PHP 中实现的?
查看完整描述

3 回答

?
慕桂英546537

TA贡献1848条经验 获得超10个赞

根据这篇文章 “空合并运算符(在 PHP 7 中引入)表示为这样??用于检查值是否已设置或为空,或者换句话说,如果值存在且不为空,则它返回第一个操作数,否则返回第二个操作数。”

所以你可以很容易地做到

$d = $a->$b->$c ?? 'DEFAULT' ;

编辑:这仅适用于属性,而不适用于方法(正如下面评论中的“hackel”所指出的那样)


查看完整回答
反对 回复 2022-01-02
?
三国纷争

TA贡献1804条经验 获得超7个赞

直到 PHP 8.0。


这已在Nullsafe 运营商 RFC 中投票通过。


语法将为?->.


所以声明:


if ($a && $a->$b && $a->$b->$c) {

  $d = $a->$b->$c;

}

可以改写为:


$d = $a?->$b?->$c;  // If you are happy to assign null to $d upon failure

或者:


if ($a?->$b?->$c) {

  $d = $a->$b->$c; // If you want to keep it exactly per the previous statement

}

Nullsafe 运算符适用于属性和方法。


查看完整回答
反对 回复 2022-01-02
?
慕哥9229398

TA贡献1877条经验 获得超6个赞

在低于 8 的 PHP 版本中,不支持可选链接。您可以通过使用错误控制运算符( )来模拟它的属性,该运算符@将抑制通常会从分配中发生的任何错误。例如:


$b = 'b';

$c = 'c';

$e = 'e';

$a = (object)['b' => (object)['e' => 2]];

@$d = $a->$b->$c;

var_dump($d);

@$d = $a->$b->$e;

var_dump($d);

输出:


NULL

int(2)

3v4l.org 上的演示


更好的解决方案是使用空合并运算符,如@FouedMOUSSI 答案中所述。


从 PHP8(2020 年 11 月 26 日发布)开始,通过nullsafe 运算符支持可选链接(请参阅 @Paul 回答或发布的副本)。


查看完整回答
反对 回复 2022-01-02
  • 3 回答
  • 0 关注
  • 325 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信