2019/01/22(JST)にImplement ??= operatorという謎のマージがありました。
RFC
RFCは賛成37、反対4の圧倒的多数で可決されています。
なお投票開始は2016/03/24で、終了が2016/04/02です。
つまり、それ以来3年弱ほったらかされていたということです。
??=ってなに?
RFCでは『Null Coalescing Assignment Operator』と呼ばれています。
どうも適切な日本語がないみたいなのですが、NULL合体演算子(Null Coalescing Operator)から類推すると『NULL合体代入演算子』とかになるんですかね?
名前のとおり、NULL合体演算子と代入演算子を合わせたような演算子です。
使い方
// NULL合体代入演算子
$id ??= getId();
// これと同じ
$id = $id ?? getId();
$id = @$id ?: getId();
$id = isset($id) ? $id : getId();
三項演算子を省略したエルビス演算子を省略したNULL合体演算子を省略したものがNULL合体代入演算子ということですね。
上記の例ではあまり恩恵を感じられませんが、左辺が長くなりがちなフレームワークでは利点が多くなることでしょう。
RFCのサンプルでは以下のような例がありました。
// これまで
$this->request->data['comments']['user_id'] = $this->request->data['comments']['user_id'] ?? 'value';
// 今後
$this->request->data['comments']['user_id'] ??= 'value';
これは確かに便利。
か?
導入
PHP7.4で導入されます。
他言語での実装
C#では2019年リリース予定のC# 8.0で導入されるようです。
Rubyでは、||の自己代入演算子である、||=というイディオムが近い動きをします。
(左辺がnilまたはfalseの場合に、右辺を代入。falseも含むため、厳密には違う動きです。)
それ以外の言語では全く見当たりませんでした。
感想
データが入ってくるかどうかわからないというWeb出自のPHPらしい演算子だと思います。
他言語であればもっと入力をちゃんと定義しろって話ですが、Web APIなんかだとそういうことも言ってられませんからね。
ただ自分で使いたいかというとちょっと微妙ですね。
ただでさえ短縮構文多いのにこれ以上増えたら混乱しそうです。
まあ、?:
とか??
とかもいつの間にか普通に使っているので、そのうち??=
も普通に使うようになっているかもしれませんが。
でも<=>
は使う機会が無い。