PHP 8 中引入的 null 合并运算符 (??) 和 nullsafe 运算符 (?->) 的区别

问题描述

我可以在 PHP 中使用 ?? 运算符来处理未定义的数组索引。 如果空安全运算符为我提供相同或扩展 ?? 运算符的功能,我感到困惑?

编辑:

我可以在现有的 PHP 版本中检查数组中是否定义了特定属性

$user_actions = ['work' => 'SEO','play' => 'Chess','drink' => 'coffee'];
$fourth_tag = $user_tags['eat'] ?? "n/a";

我想了解空安全运算符是否为我提供了更好的方法

解决方法

空合并运算符 (??) 作为 if 语句工作,如果第一个为空则取两个值,然后将其替换为第二个。

$a = null;
$b = $a ?? 'B';

此处 $b 将获得值 B,因为 $anull

在 PHP8 中,引入了 NullSafe 运算符 (?->) 将提供将调用从一个函数链接到另一个函数的选项。根据此处的文档:(https://www.php.net/releases/8.0/en.php#nullsafe-operator)

您现在可以使用带有新的 nullsafe 运算符的调用链,而不是空检查条件。当链中一个元素的求值失败时,整个链的执行就会中止,整个链的求值结果为空。

以下是文档中的示例:


$country =  null;

if ($session !== null) {
  $user = $session->user;

  if ($user !== null) {
    $address = $user->getAddress();
 
    if ($address !== null) {
      $country = $address->country;
    }
  }
}

但在 PHP8 中你可以简单地这样做:


$country = $session?->user?->getAddress()?->country;

所以两个操作员的工作方式有很大不同。