我想在链式语句中省略对 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”所指出的那样)
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 运算符适用于属性和方法。
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)
更好的解决方案是使用空合并运算符,如@FouedMOUSSI 答案中所述。
从 PHP8(2020 年 11 月 26 日发布)开始,通过nullsafe 运算符支持可选链接(请参阅 @Paul 回答或发布的副本)。