ツイート
シェア
LINEで送る
B! はてぶでブックマーク
Pocketでブックマーク
RSSフィード

PHP8, 例外処理(throw)がアロー関数で使えるようになった。

php
イラストダウンロードサイト【イラストAC】
の画像をもとに加工しています。

アロー関数内の処理はひとつの式しか書けないルールがあるので、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

この仕様変更はグッドですね?

見た目が式なので、なんでエラーになるのかしばらく迷走した人もいたでしょうから。

前の投稿
PHP8,『Throwは式になりました』ってどういうこと? 見た目から式だと思ってた。
PHP8, 例外処理(throw)が三項演算子で使えるようになった。
次の投稿
コメントを残す

*