多くの既存の PHP 4 のコードは変更無しで動作するはずですが、 以下の下位互換性がない変更点について注意する必要があります。
新たな予約キーワードがいくつか あります。
strrpos() と strripos() は、 needle として文字列全体を使用するようになりました。
文字列オフセットの不正な使用は、E_WARNING ではなく E_ERROR を発生します。不正な使用の例は、次のようなものです。 $str = 'abc'; unset($str[0]);
array_merge() は、配列のみを指定できるよう 変更されました。配列以外の変数を指定した場合は、各パラメータ毎に E_WARNING が発生します。あなたのコードで 突然 E_WARNING が発生し始める可能性が あるため注意してください。
サーバー変数 PATH_TRANSLATED は、Apache2 SAPI では暗黙のうちに設定されません。 この動作は、Apache により設定されていない場合に SCRIPT_FILENAME と同じ値に 設定する PHP 4 と異なります。 この変更は、CGI の規約に従う ためのものです。詳細については、 bug #23610 を参照してください。 また、マニュアルの $_SERVER['PATH_TRANSLATED'] についての記述も参照してください。 この問題は、PHP のバージョン >= 4.3.2 でも影響を及ぼします。
定数 T_ML_CONSTANT は、 Tokenizerエクステンションで 定義されなくなりました。error_reporting にE_ALL を指定した場合、PHPは通知(notice)を生成します。 T_ML_CONSTANTは、全く使用されていませんが、 PHP 4 では定義されていました。PHP 4とPHP 5の両方において、 // と /* */ は、共に T_COMMENT 定数と 解釈されます。 しかし、PHP5からPHPにより解釈されるようになった PHPDoc形式のコメント /** */ は、T_DOC_COMMENT と認識されます。
variables_order に "S"が含まれる場合に、$_SERVER が argc および argv と共に設定されます。 $_SERVERを作成しないような特別な設定を行った場合、当然、argc および argv は 設定されません。 この変更は、CLI 版において variables_order の 設定によらず常に argc および argv を作成するために行われました。 これにより、CLI 版では、常にグローバル変数 $argc および $argv が設定されるようになりました。
プロパティを持たないオブジェクトはもはや"空"とはみなされません。
クラスを使用する前に宣言する必要がある場合もあります。 これは、PHP 5 の新機能 (たとえば interfaces など) を使用する場合にのみ生じます。 その他の場合の動作は従来と同じです。
get_class(), get_parent_class() および get_class_methods() は、 ケース依存(大文字小文字を区別)で 宣言時に使用されたクラス/メソッドの名前を返すようになっています これにより、以前の動作(クラス名は小文字で返される)に依存している古いスクリプト では問題を発生する可能性があります。 解決策としては、全てのスクリプトでこれらの関数を検索し、 strtolower()を使用するというものが考えられます。
このケース依存性に関する変更は、 自動的に定義される定数 __CLASS__, __METHOD__, および __FUNCTION__にも適用されます。 これらの値は、宣言時と同様に(ケース依存で)返されます。
ip2long() は、 無効なIPアドレスが関数の引数として渡された場合、 -1ではなく、FALSE を返すようになりました。
読み込まれるファイルの中で関数が宣言されている場合、それが return() の前もしくは後のどちらにあるかにかかわらず、 メインファイルの中でその関数を使用可能です。 このファイルが二度読み込まれると、関数が既に宣言済みであるため、 PHP 5 は致命的なエラーを発生します。一方、PHP 4 ではエラーを発生しません。 ファイルが読み込み済であるかどうかを調べて 読みこまれたファ入ルの内容を条件分岐でかえすのではなく、 include_once() を使用することを推奨します。
Windows上で、 include_once() と require_once() は、まず、読みこまれるファイルのパスを正規化します。 これにより、A.php と a.php を読みこむ場合でもファイルは一度だけ読みこまれます。
例 D-1. strrpos() と strripos() は、 needleとして文字列全体を使用する
|
以下の例はPHP 4では有効でしたが、PHP 5では致命的なエラーを 発生します。