下位互換性のない変更点
多くの既存の 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/1.1 の規約に従うためのものです。 詳細については、 » 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 を読みこむ場合でもファイルは一度だけ読みこまれます。
- 関数に配列を値渡ししたときに、 関数の中で配列の内部ポインタが移動してもそれをリセットしなくなりました。 PHP 4 では、関数に配列を渡したときに、関数内での配列の内部ポインタがリセットされていました。 一方 PHP 5 では、配列を関数に渡すと、 関数内での配列の内部ポインタの位置は配列が関数に渡されたときのままとなります。
例1 strrpos() と strripos() は、 needleとして文字列全体を使用する
<?phpvar_dump(strrpos('ABCDEF','DEF')); //int(3)var_dump(strrpos('ABCDEF','DAF')); //bool(false)?>
例2 プロパティを持たないオブジェクトはもはや"空"とはみなされない
<?phpclass test { }$t = new test();var_dump(empty($t)); // echo bool(false)if ($t) { // 実行される}?>
以下の例はPHP 4では有効でしたが、PHP 5では致命的なエラーを 発生します。
例3 クラスは使用前に宣言する必要がある
<?php$test = new fubar();$test->barfu();class fubar { function barfu() { echo 'fubar'; }}?>