PHP 中是否有可选链接?

Chr*_*ung 11 php

我想在链式语句中省略对 null 的检查,例如

if($a && $a->$b && $a->$b->$c){
  $d = $a->$b->$c;
}
Run Code Online (Sandbox Code Playgroud)

并改用可选链接。

这是可能的还是在 PHP 中实现的?

Fou*_*SSI 23

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

所以你可以很容易地做到

$d = $a->$b->$c ?? 'DEFAULT' ; 
Run Code Online (Sandbox Code Playgroud)

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

  • 根据文档,空合并运算符只是语法糖:`exprA ?? exprB` 等价于 `isset(exprA) ?表达式A:表达式B`。isset 支持可选链之类的东西,但仅适用于数组。`$空= []; isset($empty['a']['b']); // 错误,也不例外` (2认同)
  • @Oliboy50 它仅适用于属性,不适用于方法。例如 `$a = new class () { public $b; }; $d = $a->b->c ?? '默认';` (2认同)

Pau*_*aul 12

直到 PHP 8.0。

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

语法将为?->.

所以声明:

if ($a && $a->$b && $a->$b->$c) {
  $d = $a->$b->$c;
}
Run Code Online (Sandbox Code Playgroud)

可以改写为:

$d = $a?->$b?->$c;  // If you are happy to assign null to $d upon failure
Run Code Online (Sandbox Code Playgroud)

或者:

if ($a?->$b?->$c) {
  $d = $a->$b->$c; // If you want to keep it exactly per the previous statement
}
Run Code Online (Sandbox Code Playgroud)

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

  • 来自 Swift,我立即输入 ?-> 认为它会起作用,但在尝试之前我查了一下并在这里结束! (2认同)

Nic*_*ick 11

在低于 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);
Run Code Online (Sandbox Code Playgroud)

输出:

NULL
int(2)
Run Code Online (Sandbox Code Playgroud)

3v4l.org 上的演示

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

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