Edited at

【PHP7.4】PHPの新たな演算子??=ってなんぞ?

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なんかだとそういうことも言ってられませんからね。

ただ自分で使いたいかというとちょっと微妙ですね。

ただでさえ短縮構文多いのにこれ以上増えたら混乱しそうです。

まあ、?:とか??とかもいつの間にか普通に使っているので、そのうち??=も普通に使うようになっているかもしれませんが。

でも<=>は使う機会が無い。