例外処理を重視するプログラミング言語では、何か問題が起こったらすぐに例外を投げる。それはそれでいいことではあるが、PHPはそうではなく、「例外処理も使える」プログラミング言語だ。PHPには例外処理の仕組みがあるし、コアの中でもオブジェクトを扱うときには例外処理を行うことが増えている。PHPは基本的に、よっぽど致命的なエラーが発生しない限りは何があろうと処理を続行しようとする。こんなコードを考えてみよう。1単純にnoticeレベルのエラーになるだけで、PHPはそのまま処理を続行する。例外処理を重視する世界からやってきた人にとっては、これは少しキモいと思うかもしれないね。Pythonなら、未定義の変数を参照しようとすると、例外が発生する。defined実際の違いは、こういうことだ。せずに済むようにしている。PHPは、どうしようもないエラーが発生しないかぎりは、一応エラーを報告したうえで処理を続行する。エラーの深刻度PHPのエラーは、何段階かの深刻度レベルに別れている。エラー(error)と注意(notice)そして警告(warning)だ。「エラー」は実行時の致命的な問題で、ふつうはコードの書きかたがまずいせいで発生する。これは修正しなければいけない。いうのも、これが発生するとPHPの実行がそこで止まってしまうからだ。「注意」は助言みたいなもので、問題を起こす可能性があるスクリプトを実行したときに発生する。スクリプトの実行は止まらない。「警告」は致命的ではない問題で、これもスクリプトの実行は止まらない。いう形式のメッセージもある。これは、相互運用性や将来のバージョンのPHPとの互換性を考えたときに、コードを書き換えたほうがいいと提案するためのメッセージだ。PHPのエラー報告の挙動の変更エラー報告の挙動は、PHPの設定で変更することもできるしPHPの関数で変更することもできる。どのレベルのエラー処理をするのかを設定できる。エラー(error)とか警告(warning)は表示させたいけれども、別に注意(notice)は見たくないという場合は、こんなふうにすればいい。E_WARNING);画面に表示するかしないか(開発時に有効)だけでなく、ログに出力するかしないか(運用時に有効)も制御できる。「ここでのエラーは無視すること」とPHPに指示することもできる。その式で発生したあらゆるエラーは黙って揉み消される。存在しなくてもエラーにはならない。返して何も表示しないだけだ。よさげな機能だと感じるかもしれない。これを使うと、あまり望ましくない代償を払うことになる。なしの式よりも処理効率が落ちてしまう。エラー制御演算子がパフォーマンスに及ぼす悪影響を知っておくべきだ。画面にも表示されなければ、ログに書き出されることもない。運用中のPHPシステムのエラー制御演算子を無効にする仕組みはない。今見ているエラーが仮に些細なものだとしよう。しても、それ以外に無視できないエラーが発生するかもしれない。そんなエラーも、同様に隠蔽されてしまう。エラー制御演算子を使わずにすむ道があるなら、その方向で考えるべきだ。さっきのコードなら、こんなふうに書き直せばいい。使っていてファイルの読み込みに失敗した場合だ。ファイルが削除されるかもしれない(まあありえないだろうけど、可能性はゼロではない)。ほんとはPHP側で何とかしてもらいたいところだけれど、現状ではエラーを抑制するくらいしか手がない。使えば、エラー制御演算子を無効化できる。こんなふうに書けばいい。Xdebugと同じような機能がある。この機能が役立つのは、コードのデバッグ中など、エラーから情報を読み取りたいときだ。screamを使うときには気をつけて、あくまでも一時的なデバッグ用のツールとして使うようにしよう。エラー制御演算子を無効にしたままでは正常に動かないというライブラリって、結構多いよ。Operators]SitePointXdebugScreamErrorExceptionPHPは、例外が大好きな人たちにも対応したプログラミング言語だ。ほんの数行のコードを足すだけで、例外に対応できる。クラスを使って「例外」を投げればいい。クラスを継承したものだ。これは、SymfonyやLaravelみたいな今どきのフレームワークでもよく使われている方法だ。いい感じに表示してくれる。エラーや例外の処理や表示をうまい具合にやてくれるパッケージもある。これはLaravelをデフォルトでインストールするとついてくるものだけど、ほかのフレームワークでも使える。開発中は、エラーを例外として投げるようにしておくと、その処理をしやすくなる。開発中にもし例外が発生したら、それをcatch文でラップして、その状況に対応する処理を書くこともできる。例外をひとつキャッチするたびに、アプリケーションはほんの少しずつ頑丈になっていく。ドキュメントを読もう。最近はやりのプログラミング言語には、たいてい例外処理の仕組みがある。なんかは例外処理を使いまくっている。画面を見ればすぐに「ああ、何か間違えたんだな」とわかる。返して警告を出すだけだ。古いフレームワークの多くもそんな感じだ。返してログファイルにメッセージを書き出すだけ。みたいなメソッドを実行することになる。何が問題かというと、まずエラーが発生したのかどうかを自分で調べないといけないこと。次に、エラー情報を取得する方法をドキュメントで調べないといけないこと。わかるようにしてくれたらいいのに。何かのクラスがエラーを画面に投げっぱなしにしてそのまま終わるような場合だ。そんなことをすれば、エラーがあったときにプログラム中で動的に対応することができなくなってしまう。そんな場合は、エラーではなく例外を発生させないといけない。例外にしておけば開発者がエラーに気づけるし、プログラムの中で対応できるようになる。クラスには、開発者がデバッグするためのコンテキスト情報がほとんど含まれていない。クラスのサブクラスを作るってことだ。ブロックを複数用意してそれぞれの例外で別の処理をできるようになる。用意する例外クラスを使えば少しはましになるだろう。使っているときに、無効なメソッドを要求されたとしよう。