117
66

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2019-02-19

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

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

117
66
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
117
66

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?