Null合体演算子(??)は、null値に特化した三項演算子みたいなものです。
PHP8から、このNull合体演算子にthrowによる例外処理ができるようになりました。
理由はthrowの文法が『文』から『式』に変わったから。
これで、『nullだったら例外発生』の処理が1行でできるようになります。
もうif文はいらない。
まずはこのコードを見てください。
<?php
$str = '123';
$result = $str ?? throw new Exception();
echo $str . PHP_EOL;
$str = null;
$result = $str ?? throw new Exception();
echo $str . PHP_EOL;
このコードはできるようでできません。throwは式に見えて文だから。if, forと同じ。
中括弧({})を使わず、セミコロン(;)で終わるのに式じゃないのがややこしい。
php74の実行結果
PHP Parse error: syntax error, unexpected 'throw' (T_THROW) in /home/vagrant/php-test.php on line 4
ちゃんと動くコードにするにはこうする必要がありました。
if ( !isset($str) ) {
throw new Exception();
}
これがPHP8からは、Null合体演算子でも実行可能になります。throwの例外処理が文から式に変わったから。
php80の実行結果
PHP Fatal error: Uncaught Exception in /home/vagrant/php-test.php:9
Stack trace:
#0 {main}
thrown in /home/vagrant/php-test/.php on line 9
これでもう、わざわざif文で書く必要はないですね?
このコードはこれから、けっこう見るようになるんじゃないかな?
ちなみに、Null合体演算子は、nullかどうか見るので、空文字('')はtrueになります。
$str = '';
$result = $str ?? throw new Exception();
echo 'isset not equal empty' . PHP_EOL;
php80の実行結果
isset not equal empty
PHP公式ドキュメント
また、PHP8では似たようなものにNullsafe演算子というものが追加されました。あわせてこちらもどうぞ。