17

有没有办法使用某种安全导航运算符编写以下语句?

echo $data->getMyObject() != null ? $data->getMyObject()->getName() : '';

所以它看起来像这样:

echo $data->getMyObject()?->getName();
4

3 回答 3

33

从 PHP 8 开始,您可以使用null 安全运算符,它与 null 合并运算符相结合,允许您编写如下代码:

echo $data->getMyObject()?->getName() ?? '';

通过使用?->而不是->运算符链终止,结果将为空。

“查看对象内部”的运算符被视为链的一部分。

  • 数组访问 ([])
  • 属性访问 (->)
  • Nullsafe 属性访问 (?->)
  • 静态属性访问 (::)
  • 方法调用 (->)
  • Nullsafe 方法调用 (?->)
  • 静态方法调用 (::)

例如代码:

$string = $data?->getObject()->getName() . " after";

如果 $data 为空,则该代码将等效于:

$string = null . " after";

由于字符串连接运算符不是“链”的一部分,因此不会短路。

于 2020-08-02T23:45:25.267 回答
8

不,那里没有。

处理此问题的绝对最佳方法是设计您的对象,使其始终返回特定类型的已知、良好、已定义的值。

对于绝对不可能的情况,您必须这样做:

$foo = $data->getMyObject();
if ($foo) {
    echo $foo->getName();
}

或许

echo ($foo = $data->getMyObject()) ? $foo->getName() : null;
于 2012-09-10T12:34:03.323 回答
3

Nullsafe 运算符允许您链接调用,避免检查链的每个部分是否不为空(空变量的方法或属性)。

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 上的属性“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"
于 2020-11-27T22:41:33.303 回答