設定変更
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
)
警告 |
従来の値7および15を使用してエラー出力を設定する方法は、パースエ
ラーを含む新たに追加されたエラークラスのいくつかが使用できなくな
るため、非常に悪い方法です。この場合、スクリプトが動作しない場合
でもエラーメッセージをどこにも表示しないため、非常に奇妙な動作と
なることがあります。
これにより、過去において、原因を追求が困難なスクリプトエンジンの
問題と報告された多くの再現不可能なバグレポートが、実際には、
requireで読み込まれたファイルにいくつかの '}' が足りず、エラー出
力の設定を誤っていたためにパーサがエラーを出力できなかったという
ことがあります。
このため、スクリプトが何も出力せずに終了する場合、エラー出力設定
をまず確認するべきです。現在のZend エンジンは十分に完成されてお
り、この種の奇妙な動作を発生しません。
|
追加された警告メッセージ
既存の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では初期化されていない変数または配列要素を使用し
ていることを知らせるようになっています。