??演算子

php7で、演算子??が導入されました。正式名はNull Coalescing Operatorだそうです。公式ドキュメントによれば、日本語にすると「Null合体演算子」……。

SQLのCOALESCE関数を連想する人もいると思いますが、まさに同じ役割です。すなわち、「変数の値がnullかもしれない。そのまま使うとエラーになるかも。もしnullなら、別の値に置き換えたい。」みたいなときに使います。

例えば:

$name = getElementById(123);  // これは架空の関数。
echo is_null($name) ? 'Not found' : $name;

こんなとき、??演算子を使えば、2行目を少しスッキリ書けます。

echo $name ?? 'Not found';

未定義の変数にも使える

??演算子は、nullだけでなく、未定義の変数に対しても効果があります(個人的には、こっちの方がポイント高いです)。

例えば、連想配列$entitynameキーが未定義かもしれない場合:

echo isset($entity['name']) ? $entity['name'] : 'No name';

と書く代わりに:

echo $entity['name'] ?? 'No name';

と書けます。これは、ありがたいですね。特に連想配列がネストしてる場合なんかに助かります。

echo $some_deeply_nested_data['hoge']['fuga']['piyo'] ?? 'Huh!';

ちなみに、オブジェクトのプロパティが未定義の場合でも大丈夫です。

echo $entity->name ?? 'No name';

注意点

何となく、「三項演算子の真の方の分岐が省略できるのかな?」みたいな印象を受けるかもしれませんが、それは勘違いです。

$a = false;
$b = null;
echo $a ? $a : 'Not true!';     // Not true!
echo $b ? $b : 'Not true!'      // Not true!

三項演算子は真偽で分岐します。phpのnullは偽として扱われるので、$aに対しても$bに対しても、Not true!が出ます。

一方、??演算子は、あくまでもnullかどうかで分岐します。そしてfalsenullではないです。よって、$aに対しては、$aの値がそのまま出ます(↓)。

var_export($a ?? 'Null or unset');  // false
var_export($b ?? 'Null or unset');  // Null or unset
// ↑echoだとfalseが見えない(空文字列になる)のでvar_exportを使用。

また、未定義の変数に対して三項演算子を使うと、警告(Notice)が発生します。

echo $wat ? $wat : 'What?';
//=> Notice: Undefined variable: wat in php shell code on line 1

おまけ

一連のコードを、phpの対話シェルで実行した結果も載せておきます。

$ php -a
Interactive shell
php > echo phpversion();
7.2.7
php > 
php > $a = false;
php > $b = null;
php > echo $a ? $a : 'Not true!';
Not true!
php > echo $b ? $b : 'Not true!';
Not true!
php > 
php > var_export($a ?? 'Null or unset');
false
php > var_export($b ?? 'Null or unset');
'Null or unset'
php > 
php > error_reporting(E_ALL);
php > echo $wat ? $wat : 'What?';
Notice: Undefined variable: wat in php shell code on line 1
What?
php > echo $wat ?? 'What?';
What?
php >