PHP 3では、エラー出力レベルは異なったエラーレベルを意味する数
を合計した単純な数値で表されていました。よく使用されるのは、全て
のエラーと警告を出力する15と好ましくない形式や事項を通知するメッ セージ以外の全てを出力する7です。
PHP 4では、より多くの異なったエラーおよび警告レベルを設定して
おり、設定ファイルにおいて意図する動作を設定するために定数シンボ ルを使用することが可能になっています。
エラー出力レベルは、出力したくないエラーメッセージの警告レベルを 定数シンボル
E_ALL
と排他的論理和をとることに より明示的に取り除くことにより指定することも可能になっています。 解りにくいでしょうか?
では、ここで定数シンボル
E_NOTICE
に分類される簡単な警告以外のエラー出 力を行うように設定したい場合を考えます。この場合、
php.ini
において次のような指定を行います。
error_reporting = E_ALL ~ ( E_NOTICE
)
ここでさらに警告の出力を行わないようにしたい場合は、次のように括
弧の中でバイナリまたは演算子'|'を使用して適当な定数を追加します。
error_reporting= E_ALL ~ ( E_NOTICE |
E_WARNING )
警告 |
|
既存のPHP 3コードの多くは、このコードのように非常に悪いスタイル
の言語構造を使用しており、意図された通りに動作している場合でも、
他の部分を変更すると動作しなくなることがあります。PHP 4は、PHP
3が出力しないような場面でも多くの通知メッセージを出力します。
E_NOTICEメッセージをオフにすれば簡単に修正できますが、通常は問題
のあるコードを修正する方が良いでしょう。
通知メッセージが出力される場面で最も多いのが、引用符で括られてい
ない文字列定数を配列の添字として使用している場合です。その名前の キーワードまたは定数が存在しない場合、PHP
3と4は共にこれら を文字列として解釈し直します。しかし、そのコードのどこか他の場所
でその名前の定数が定義されている場合、このスクリプトは意図した通
りに動作しない可能性があります。これは、侵入者が文字列定数を再定
義して使用されるスクリプトが侵入者が有さないアクセス権を侵入者に
与えるようにする場合には、セキュリティのリスクとなることさえあり ます。そこで、PHP 4では、例えば、
$HTTP_SERVER_VARS[REQUEST_METHOD]
のように引用 符で括られていない文字列定数を使用した場合に警告を発生するように なっています。これを
$HTTP_SERVER_VARS['REQUEST_METHOD']
に変更する ことにより、パーサは正常に動作し、コードのスタイルとセキュリティ は大幅に改善されます。
その他、PHP 4では初期化されていない変数または配列要素を使用し
ていることを知らせるようになっています。