PHPの?:(はてなコロン)と??(はてなはてな)演算子

こんにちは、さるまりんです。

PHPのいろんなコードを見ていて?:??を見かけます。

3項演算子については、以前に少し書きました。

これです。

(条件 ? trueの時 : falseの時)

上手く使うとifとelseを使って書くよりもスッキリと書くことができます。

ではそれに似た?:??の演算子はどんな風に使うのかを書いていきます。

まずは?:から。

?:は「エルビス演算子」と呼ばれるものです。

(条件(かつtrueの時) ?: falseの時)

ひとつ目の表現がtrueの時、ひとつ目の表現そのものに、そうでない時は?:の後にくる表現に評価されます。

3項演算子?:で書くとこうなります。

「表現1」 ? 「表現1」 : 「表現2」

こんな風に使います。

echo "名前:" . ($name ?: "[ついてません]");

これを

$name = '';

の状態で呼び出されると

名前:[ついてません]

と表示され

$name = 'さるまりん';

の状態で呼び出されると、

名前:さるまりん

と表示されます。

では??は。

??は「Null合体演算子」と呼ばれるものです。

(nullでなければ ?? nullの時)

ひとつ目の表現がnullか否かを判断し、nullでなければそのものに、そうでなければ??の後ろにくる表現に評価します。

3項演算子?:で書くとこうなります。

!is_null(「表現1」) ? 「表現1」: 「表現2」

?:の時と同じように使ってみます。

echo "名前:" . ($name ?? "[ついてません]");

これを

$name = 'さるまりん';

の状態で呼び出すと

名前:さるまりん

と表示されます。

$name = '';

だと

名前:

と表示されます。動作が変わりましたね。

nullかどうかをチェックするので、空文字列ならnullでないと評価されそのものが表示されます。

$name = null;

だと

名前:[ついてません]

と表示されます。

演算子??、こんな時に便利です。

配列の要素が設定されているかどうかをチェックしてからその値を使う次のようなコードがあります。

$name = isset($array['name']) ? $array['name'] : '';

これ↑をこう↓のように書き換えることができます。

$name = $array['name'] ?? '';

短くなりました。

あまりにややこしいことを?:??を使って書くことはコードが読みにくくなりそうですが、シンプルなケースではスッキリ短くなっていいかなと思います。
何より、??Null合体演算子は$array['name']が存在しない(未定義=undefined)時でもエラーを返さないので、isset()のチェックの山から逃げ出せるのはとても助かります。

便利に使っていきたいと思います。
目指せ、わかりやすく簡潔なコード!

読んでくださってありがとうございます。

それではまた!