是否有任何方法可以使用某种安全的导航运算符编写以下语句?
echo $data->getMyObject() != null ? $data->getMyObject()->getName() : '';
所以它看起来像这样:
echo $data->getMyObject()?->getName();
从PHP 8,您可以使用null安全运算符,该运算符与null合并运算符相结合,可以编写如下代码:
echo $data->getMyObject()?->getName() ?? '';
通过使用?->
而不是->
,运算符链被终止,结果将为null。
运营商";观察物体内部";被视为链的一部分。
- 阵列访问([])
- 属性访问(->)
- Nullsafe属性访问(?->)
- 静态属性访问(::)
- 方法调用(->)
- Nullsafe方法调用(?->)
- 静态方法调用(::)
例如,对于代码:
$string = $data?->getObject()->getName() . " after";
如果$data为null,则该代码等效于:
$string = null . " after";
由于字符串串联运算符不是"链"的一部分,因此不会短路。
Nullsafe运算符允许您将调用链接起来,从而避免检查链接的每个部分是否都不是null(null变量的方法或属性)。
PHP 8.0
$city = $user?->getAddress()?->city
PHP 8.0之前
$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时:
未捕获错误:在空上调用成员函数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"
没有。
处理这一问题的最佳方法是设计对象,使其始终返回特定类型的已知、良好、定义的值。
对于绝对不可能的情况,您必须执行以下操作:
$foo = $data->getMyObject();
if ($foo) {
echo $foo->getName();
}
或者
echo ($foo = $data->getMyObject()) ? $foo->getName() : null;
对于PHP 8.0之前的Laravel,您可以使用optional()
$city = optional(optional($user)->getAddress())->city