Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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

ただ自分で使いたいかというとちょっと微妙ですね。
ただでさえ短縮構文多いのにこれ以上増えたら混乱しそうです。
まあ、?:とか??とかもいつの間にか普通に使っているので、そのうち??=も普通に使うようになっているかもしれませんが。
でも<=>は使う機会が無い。

rana_kualu
不労所得で生きたい。
https://twitter.com/rana_kualu
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away