アロー関数内の処理はひとつの式しか書けないルールがあるので、throwによる例外処理はできませんでした。
これがPHP8からできるようになりました。throwの文法が『文』から『式』に変わったから。
throwのコードは見た目が式なので、何がエラーなのか戸惑った人もいたでしょう。
この仕様変更は◎。使う機会が多そう。
アロー関数ってなんだ? と思う人はまずは復習のためにこちらからどうぞ。
アロー関数の復習が終わったところで、まずはこのコードを見てください。
<?php
$callable = fn() => throw new Exception();
$callable();
見た感じ、何もまちがってるように見えません。でもこのコード、PHP7以前ではエラーになります。
php74の実行結果
PHP Parse error: syntax error, unexpected 'throw' (T_THROW) in /home/vagrant/php-test.php on line 3
理由は、throwの例外処理は式ではなく文だから。
『いや、セミコロン(;)で終わってるし式にしか見えないんだけど?』
と思うでしょうが、これ文なんです。中括弧({})で括ってないのに。
コードの文法上はif, forなどと同じ。
これがPHP8から変わりました。PHP8からthrowは文ではなく式になります。
php80の実行結果
PHP Fatal error: Uncaught Exception in /home/vagrant/php-test.php:3
Stack trace:
#0 /home/vagrant/php-test.php(4): {closure}()
#1 {main}
thrown in /home/vagrant/php-test.php on line 3
この仕様変更はグッドですね?
見た目が式なので、なんでエラーになるのかしばらく迷走した人もいたでしょうから。