是否存在“;nulsafe运算符“;在PHP中


Is there a "nullsafe operator" in PHP?

是否有任何方法可以使用某种安全的导航运算符编写以下语句?

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