例外をキャッチするとき、catch() の中で例外の変数を定義するのがこれまでのルールでしたが、PHP8からその変数がなくてもよくなりました。
この変数は必ずしも使うものではなく、使わないときただの無駄だったから。
ただし、例外のクラスは定義しないといけません。
まずは、これまでの例外のキャッチの方法を見てみましょう。
function test()
{
throw new ErrorException();
}
try {
test();
} catch (ErrorException $ex) {
echo 'error !!!' . PHP_EOL;
die();
}
実行結果
error !!!
このように、とりあえず例外を発生させるけども、あまり重要じゃないのでエラーメッセージとか一切設定しないこととかあります。
そういうとき、$ex を使わないことも多い。
ここは独自のエラーメッセージを入れたい、とかもそうですね?
こういうときこそ、PHP8から追加された記法が使えます。
try {
test();
} catch (ErrorException) {
echo 'error !!! non exception variable.' . PHP_EOL;
die();
}
php80の実行結果
error !!! non exception variable.
普通、変数が定義されたらどこかで使ってると思うじゃないですか?
それなのに、例外の変数って意外と使わないことあるよね? という疑問から生まれた文法です。
もちろんですが、PHP7以前はシンタックスエラーになります。
php74の実行結果
PHP Parse error: syntax error, unexpected ')', expecting '|' or variable (T_VARIABLE) in /home/vagrant/php-test.php on line 11
この文法はよく使いそう。
ちなみにPHPの公式ドキュメントでは、『catch で例外のキャプチャが不要になる』と表現しています。
この文法変更は7年前(2013年)から考えられてたそうですが、当時は例外の種類によらずなんでもキャッチするアイディアだったそうです。
2013年に考案された文法
try {
test();
} catch {
echo 'error !!!' . PHP_EOL;
die();
}
さすがにこれは却下の嵐で実現しなかったらしい。
(もちろんPHP8でも実現されていない。シンタックスエラーになる。)
RFCでは、PHP8での変更が好評なので再検討してもいいんじゃないかと結んでいます。
(希望的観測で必ずやるとは言ってない。)