Null合体演算子??
の代入版であるNull合体代入演算子??=
がPHP7.4で導入されることになった。
// PHP7.3以前
$a = $a ?? $b;
// PHP7.4以降
$a ??= $b;
Null合体演算子??
が導入されたのはPHP7.0で結構前のできごとで、よく使う人もいれば、使いみちが見つからないという感想を持っている人もいそうだ。
そこに来て、Null合体代入演算子??=
が追加されるニュースが出たので、ますます「それどこに使うの?」と感じる人も出てきそうだ。
僕がぱっと思いつく限りでは、??=
の使い所はデフォルト引数だと思う。以前、PHP7からは引数デフォルト値にはNull合体演算子「??」を使うと良い - Qiitaという投稿をした。この投稿の内容は、引数の値にnull
を渡したら関数のほうで定義したデフォルト値が使われるような関数を作るときは、??
演算子を使うと良いというものだった。
// PHP7.1〜PHP7.3の書き方
function f(?int $x = null, ?int $y = null, ?int $z = null): void
{
$x = $x ?? 1;
$y = $y ?? 2;
$z = $z ?? 3;
echo "$x, $y, $z\n";
}
f(); //=> 1, 2, 3
f(null, null, 9); //=> 1, 2, 9
Null合体代入演算子??=
が導入されれば、こうした関数の実装はもう少しシンプルに書くことができるようになる。
function f(?int $x = null, ?int $y = null, ?int $z = null): void
{
$x ??= 1;
$y ??= 2;
$z ??= 3;
echo "$x, $y, $z\n";
}
ちょっとした改善ということで??=
が加わることも個人的には嬉しく感じる。
他にもこんな実用法あるよ、などあれば教えて下さい。
所感
引数にnullを渡すのって、nullを渡したいというより、その引数を省略したいだけだから、??とか??=を使ったイディオムが増えるより、こういう書き方ができるようになるのがPHPerにとってはいいんでしょうけど。 pic.twitter.com/txJyDPpiwY
— suin❄️PHPでオブジェクト指向 (@suin) 2019年2月20日