サイド上背景

サイトについて

リンクフリー

個人ご利用の場合はリンクフリーです。備忘録等に各種ドキュメントへのリンク。ご自由にご利用ください。

転載

出典元表記(当社名orリンク記載)の際は転載等ご自由にご利用ください。

ライセンス

このページの内容の一部は、Google が作成、提供しているコンテンツをベースに変更・複製したもので、クリエイティブ・コモンズの表 示 3.0 ライセンスに記載の条件に従って使用しています。

株式会社 Sola.com

ソラコムお問い合わせ

〒981-0913
宮城県仙台市青葉区昭和町3-7 スカイコート上杉601
TEL:022-234-9972
Fax:022-778-6779

きょうのことば

" 今度OOしようだとか。今度XXするよとか…。いい加減な口約束だよ。「今度」と「おばけ」は出たためしがない。 "

(Murata 2010)


コンテンツ背景
Home スタッフ雑記 sato PHP再入門13
PHP再入門13

エラー制御演算子とは

エラー制御演算子とはアット「@」で表され、エラーの出力を制御する事のできる演算子です。PHPの式の前につけるとその式で発生したエラーは無視され出力されません。

PHPでは親切にエラーメッセージを出力してくれますが、この出力が逆に邪魔になる時があります。そのような時に@演算子でエラーの制御をすると便利です。

主にはファイルやデータベースが開けなかった場合にエラーが出てしまうのを回避するためにファイル操作やデータベース接続などで使われているようです。

存在しないファイルを開こうとするとWarningエラーが発生しますが、エラー制御演算子「@」を使えばエラーは出力されません。

@fopen("存在しないファイル");

未定義の変数を呼び出すとこれまたNoticeエラーという普通では出力されないエラーがPHP内部で発生することになりますが、これもエラー制御演算子「@」で回避できます。

@$undefined; // 未定義の変数

Noticeエラーはデフォルトの設定では出力されないため、意識する事は少ないかもしれませんがPHP内部ではエラーが発生しているので一応覚えておいて下さい。

ただし、エラー制御演算子「@」でパースエラー(文法ミス)によるエラーメッセージは制御する事ができません。

PHPのエラー文

PHPで出力されるエラーはエラー定数として定義されています。PHPですでに定義されている定義済み定数ってやつです。

参考PHPでの定義済み定数1:エラー定数

PHPのエラーには、文法ミスなどの致命的なエラーから未定義の変数などを呼び出した時の軽いエラーまであります。よく見るエラーは以下のようなものです。

エラー 定数名

Parseエラー

E_PARSE

Warningエラー

E_WARNING

Noticeエラー

E_NOTICE

このうち文法ミスってのがParseエラーとして出力されスクリプトの実行すら止まってしまいます。これだけは上でも触れたとおりエラー制御演算子「@」でも回避できません。行末にセミコロン「;」を付け忘れたとか、文字列をクォートしなかったなどの場合に発生します。

Waringエラーはエラー文が出力されますが、スクリプトの実行は止まりません。スクリプト実行に何か問題があり、その部分の実行ができない場合などに出力されます。存在しない配列やファイルを操作しようとすると発生します。

Noticeエラーは軽い警告でスクリプトの実行には問題ないけど、やめといた方がいいよってくらいのエラーです。エラー文も出力されませんし、ス クリプトの実行も止まりません。よーするに見た目は何も変わりませんww。PHP内部でエラーが出ているだけなので気にしなくていいかもしれませんが、デ バック時にはこのエラーが役立つことも多々あります。未定義の変数を使用した場合などに発生します。

PHPではエラー報告レベルというものが設定されていて、これで出力されるエラーの種類が決められています。今までの説明でエラーが出力されるかど うかというのはすべてデフォルトの設定の場合です。この設定を変更するとNoticeエラーを見る事ができるようになりますが、その場合にはerror_reporting()関数を使います。この関数はエラー報告レベルを変更する事ができるので、デフォルトでは出力されないエラーを出力することができます。

参考関数

PHPのエラー報告レベルのデフォルト値は2039(E_ALL~E_NOTICE)となっています。この設定ではNoticeエラーを含まないのでNoticeエラーを出力する際には

error_reporting(E_NOTICE); // 定数名で指定
error_reporting(8);        // ビット値で指定
error_reporting(E_ALL);    // すべてのエラーを出力

などのようにします。