我在翻看 PHP 的 RFC 列表的時候發現了一篇不算新的,但頗有意思的 rfc:空合併賦值操做符 (姑且就這麼翻譯吧)。php
它會引發個人注意的還有一個緣由是我以前寫過這樣一篇文章:兩行代碼給 PHP7 添加一個「非空合併」語法糖,裏面講的是添加一個 ??:
操做符的方法, 而如今要講的這個,已經被接受的 rfc 裏添加的操做符是: ??=
。html
因爲這個事情自己可說的很少,這裏就根據 rfc 簡單描述一下吧。如下部分是 rfc 的翻譯。php7
合併賦值操做符在上世紀七十年代就出現了,最先是在 C 語言裏,好比 $x = $x + 3
能夠被簡寫爲 $x += 3
。隨着 PHP 成爲一門專一於 Web 的語言,??
操做符常常會被用去檢查變量是否存在:好比:this
$username = $_GET['user'] ?? 'nobody';
可是因爲大部分狀況下變量的名稱迴避 $username
長不少,因此在使用 ??
檢查後講變量自己賦值給本身的時候會須要些一些重複的代碼,形如如下形式:.net
$this->request->data['comments']['user_id'] = $this->request->data['comments']['user_id'] ?? ‘value’;
這就是爲何須要一個能在自我賦值的時候進行空合併檢查的賦值操做符的緣由。翻譯
雖然 ??
是一個比較操做符,??=
確實一個賦值操做符號。若是左值爲 null
,右值會被賦給左值,不然不作任何操做。code
// 下面這一行有相同的效果 $this->request->data['comments']['user_id'] = $this->request->data['comments']['user_id'] ?? 'value'; // 使用新操做符替代重複的代碼 $this->request->data['comments']['user_id'] ??= 'value';
用簡單描述就是:左值爲空時複製右值。htm
從實際的工程經驗上來講,這個操做符確實能簡化判斷。這也不是第一個三個字符組成的操做符(除此以外還有 <<=
、>>=
、===
、!==
)。blog
這個操做符並無出如今 PHP7.1 中,由於 rfc 提出來的時候已經 7.1 已是 beta3 了,而新特性須要在 beta1 時就凍結,因此在 7.2 中應該就能夠用上它了。get
既然說到簡化重複的代碼,??=
都已經來了,??:
還會遠嗎 ? 。