38

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

这有什么不同?

4

6 回答 6

37

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';

这不起作用的一种情况是,如果您希望将值分配给不同的变量,那么您将无法使用这个新选项。因此,虽然这是受欢迎的,但可能有一些有限的用例。

于 2019-11-29T10:19:27.317 回答
29

文档

Coalesce equal 或 ??=operator 是一个赋值运算符。如果左参数为空,则将右参数的值分配给左参数。如果该值不为 null,则不执行任何操作。

例子:

// 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';

因此,如果之前没有分配过值,它基本上只是分配值的简写。

于 2019-11-29T10:11:45.943 回答
6

空合并赋值运算符是分配空合并运算符结果的简写方式。

官方发布说明中的一个示例:

$array['key'] ??= computeDefault();
// is roughly equivalent to
if (!isset($array['key'])) {
    $array['key'] = computeDefault();
}
于 2019-11-29T10:15:17.910 回答
4

空值合并赋值运算符链接:

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

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

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

3v4l.org 上的示例

于 2020-05-26T22:47:03.187 回答
2

示例文档

$array['key'] ??= computeDefault();
// is roughly equivalent to
if (!isset($array['key'])) {
    $array['key'] = computeDefault();
}
于 2019-11-29T10:13:42.103 回答
0

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

$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);
}
于 2021-10-08T04:35:33.430 回答