什么是空合并赋值 ??= PHP 7.4 中的运算符

What is null coalescing assignment ??= operator in PHP 7.4

我刚刚看了一个关于即将推出的 PHP 7.4 功能的视频,并看到了这个新的 ??= 运算符。我已经知道 ?? 运算符。

这有什么不同?

来自docs

Coalesce equal or ??=operator is an assignment operator. If the left parameter is null, assigns the value of the right paramater to the left one. If the value is not null, nothing is done.

示例:

// The folloving lines are doing the same
$this->request->data['comments']['user_id'] = $this->request->data['comments']['user_id'] ?? 'value';
// Instead of repeating variables with long names, the equal coalesce operator is used
$this->request->data['comments']['user_id'] ??= 'value';

所以基本上就是一个shorthand如果之前没有赋值就赋值

示例Docs

$array['key'] ??= computeDefault();
// is roughly equivalent to
if (!isset($array['key'])) {
    $array['key'] = computeDefault();
}

空合并赋值运算符是一种 shorthand 分配空合并运算符结果的方法。

来自官方的例子release notes:

$array['key'] ??= computeDefault();
// is roughly equivalent to
if (!isset($array['key'])) {
    $array['key'] = computeDefault();
}

PHP 7 中最初发布,允许开发人员简化 isset() 检查与三元运算符的结合。例如,在PHP 7之前,我们可能有这样的代码:

$data['username'] = (isset($data['username']) ? $data['username'] : 'guest');

PHP 7 发布时,我们可以将其写为:

$data['username'] = $data['username'] ?? 'guest';

但是现在,当 PHP 7.4 发布时,这可以进一步简化为:

$data['username'] ??= 'guest';

如果您要为不同的变量赋值,则此方法不起作用的一种情况是,您将无法使用此新选项。因此,虽然这是受欢迎的,但可能会有一些有限的用例。

空合并赋值运算符链接:

$a = null;
$b = null;
$c = 'c';

$a ??= $b ??= $c;

print $b; // c
print $a; // c

Example at 3v4l.org

您可以使用它在循环的第一次迭代期间初始化变量。但要小心!

$reverse_values = array();
$array = ['a','b','c']; // with [NULL, 'b', 'c'], $first_value === 'b'
foreach($array as $key => $value) {
  $first_value ??= $value; // won't be overwritten on next iteration (unless 1st value is NULL!)
  $counter ??= 0; // initialize counter
  $counter++;
  array_unshift($reverse_values,$value);
}
// $first_value === 'a', or 'b' if first value is NULL
// $counter === 3
// $reverse_values = array('c','b','a'), or array('c','b',NULL) if first value is null

如果第一个值是 NULL,那么 $first_value 将被初始化为 NULL,然后被下一个非 NULL 值覆盖。如果数组有很多 NULL 值,$first_value 将以 NULL 或最后一个 NULL 之后的第一个非 NULL 结束。所以这似乎是个糟糕的主意。

我仍然更喜欢做这样的事情,主要是因为它更清晰,而且还因为它与 NULL 作为数组值一起使用:

$reverse_values = array();
$array = ['a','b','c']; // with [NULL, 'b', 'c'], $first_value === NULL
$counter = 0;
foreach($array as $key => $value) {
  $counter++;
  if($counter === 1) $first_value = $value; // does work with NULL first value
  array_unshift($reverse_values,$value);
}