13
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

エラー制御演算子について理解する

Last updated at Posted at 2018-06-01

phpにはエラー制御演算子というものがあり、@を記述するとエラーが発生しても処理を継続させることができる。

どんなことができるのか

エラー制御演算子を使用した箇所で発生したエラーを無視することができます。
例えば以下のような未定義の変数を参照するようなコードを実行してみます。

echo @$aaa;
echo "okay";

結果

ore@mypc:~/$ php -d log_errors=On -d error_reporting=-1 -d display_errors=Off -d test.php
okay

$aaa は未定義変数なので通常 NOTICE レベルのエラーになりますが、未定義変数の前にエラー制御演算子 "@" がついているので、何もエラーにならず "okay" という文字列は出力されます。

注意すべきところ

エラーハンドラがどのように設定されているかによって動きが変わってきます。

php ではエラーをハンドリングするために set_error_handler を多くのプロジェクトでは使用されていると思いますが、その場合でも正しく動作させるには以下のように if 文を追加する必要があります。

set_error_handler(function($error_no, $error_msg, $error_file, $error_line, $error_vars) {
    if (error_reporting() === 0) {
        return;
    }
    throw new ErrorException($error_msg, 0, $error_no, $error_file, $error_line);
});

error_reportingは普段は現在のエラーレベルを取得する関数ですが、set_error_handlerのドキュメントに記載されているようにエラー制御演算子が付加されている場合に呼ばれたときだけ error_reporting の値が 0 になるという仕様があります。これを利用して判定することでエラー制御演算子だったら無視するようにしています。

set_error_handler はエラー制御演算子のあるなし関係なく呼び出せれるので、この if 文がない場合はここで ErrorException を投げてしまいい、エラー制御演算子は実質動作していないような状態になってしまいます。

最後に

  • 私はどちらかというと、あまりエラー制御演算子に頼ったコードを書きたくないなーと思ってます。
  • エラー制御演算子をプロジェクト内で使ってほしくないのであれば、上記の if 文を書かない状態にするのが良いと思います。
13
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?