有没有办法使用某种安全导航运算符编写以下语句?
echo $data->getMyObject() != null ? $data->getMyObject()->getName() : '';
所以它看起来像这样:
echo $data->getMyObject()?->getName();
从 PHP 8 开始,您可以使用null 安全运算符,它与 null 合并运算符相结合,允许您编写如下代码:
echo $data->getMyObject()?->getName() ?? '';
通过使用?->
而不是->
运算符链终止,结果将为空。
“查看对象内部”的运算符被视为链的一部分。
例如代码:
$string = $data?->getObject()->getName() . " after";
如果 $data 为空,则该代码将等效于:
$string = null . " after";
由于字符串连接运算符不是“链”的一部分,因此不会短路。
不,那里没有。
处理此问题的绝对最佳方法是设计您的对象,使其始终返回特定类型的已知、良好、已定义的值。
对于绝对不可能的情况,您必须这样做:
$foo = $data->getMyObject();
if ($foo) {
echo $foo->getName();
}
或许
echo ($foo = $data->getMyObject()) ? $foo->getName() : null;
Nullsafe 运算符允许您链接调用,避免检查链的每个部分是否不为空(空变量的方法或属性)。
$city = $user?->getAddress()?->city
$city = null;
if($user !== null) {
$address = $user->getAddress();
if($address !== null) {
$city = $address->city;
}
}
使用null coalescing operator
(它不适用于方法):
$city = null;
if($user !== null) {
$city = $user->getAddress()->city ?? null;
}
Nullsafe operator
抑制错误:
警告:尝试在致命错误中读取 null 上的属性“city”:
未捕获的错误:在 null 上调用成员函数 getAddress()
但是它不适用于数组键:
$user['admin']?->getAddress()?->city //Warning: Trying to access array offset on value of type null
$user = [];
$user['admin']?->getAddress()?->city //Warning: Undefined array key "admin"