一个神奇的操作符即将加入PHP

Dec 22, 2016

我在翻看 PHP 的 RFC 列表的时候发现了一篇不算新的,但很有意思的 rfc:空合并赋值操作符 (姑且就这么翻译吧)。

它会引起我的注意的还有一个原因是我之前写过这样一篇文章:两行代码给 PHP7 添加一个“非空合并”语法糖,里面讲的是添加一个 ??: 操作符的方法, 而现在要讲的这个,已经被接受的 rfc 里添加的操作符是: ??=

由于这个事情本身可说的不多,这里就根据 rfc 简单描述一下吧。以下部分是 rfc 的翻译。


合并赋值操作符在上世纪七十年代就出现了,最早是在 C 语言里,比如 $x = $x + 3 可以被简写为 $x += 3。随着 PHP 成为一门专注于 Web 的语言,?? 操作符经常会被用去检查变量是否存在:比如:

$username = $_GET['user'] ?? 'nobody';

但是由于大部分情况下变量的名称回避 $username 长很多,所以在使用 ?? 检查后讲变量本身赋值给自己的时候会需要些一些重复的代码,形如以下形式:

 $this->request->data['comments']['user_id'] = $this->request->data['comments']['user_id'] ?? value;

这就是为什么需要一个能在自我赋值的时候进行空合并检查的赋值操作符的原因。

虽然 ?? 是一个比较操作符,??= 确实一个赋值操作符号。如果左值为 null,右值会被赋给左值,否则不做任何操作。

// 下面这一行有相同的效果
$this->request->data['comments']['user_id'] = $this->request->data['comments']['user_id'] ?? 'value';
// 使用新操作符替代重复的代码
$this->request->data['comments']['user_id'] ??= 'value';

用简单描述就是:左值为空时复制右值。


从实际的工程经验上来说,这个操作符确实能简化判断。这也不是第一个三个字符组成的操作符(除此之外还有 <<=>>====!==)。

这个操作符并没有出现在 PHP7.1 中,因为 rfc 提出来的时候已经 7.1 已经是 beta3 了,而新特性需要在 beta1 时就冻结,所以在 7.2 中应该就可以用上它了。

既然说到简化重复的代码,??= 都已经来了,??: 还会远吗 😄 。