php7の ?? 演算子、使ってますか??
??演算子
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
だけでなく、未定義の変数に対しても効果があります(個人的には、こっちの方がポイント高いです)。
例えば、連想配列$entity
のname
キーが未定義かもしれない場合:
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
かどうかで分岐します。そしてfalse
はnull
ではないです。よって、$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 >