我刚刚看过一个关于即将推出的 PHP 7.4 功能的视频,并看到了这个新的??=
运算符。我已经认识??
接线员了。
这有什么不同?
在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';
这不起作用的一种情况是,如果您希望将值分配给不同的变量,那么您将无法使用这个新选项。因此,虽然这是受欢迎的,但可能有一些有限的用例。
从文档:
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';
因此,如果之前没有分配过值,它基本上只是分配值的简写。
空合并赋值运算符是分配空合并运算符结果的简写方式。
官方发布说明中的一个示例:
$array['key'] ??= computeDefault();
// is roughly equivalent to
if (!isset($array['key'])) {
$array['key'] = computeDefault();
}
空值合并赋值运算符链接:
$a = null;
$b = null;
$c = 'c';
$a ??= $b ??= $c;
print $b; // c
print $a; // c
示例文档:
$array['key'] ??= computeDefault();
// is roughly equivalent to
if (!isset($array['key'])) {
$array['key'] = computeDefault();
}
您可以使用它在循环的第一次迭代期间初始化变量。但要小心!
$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);
}