PHP 5.0.x における変更点
CLI と CGI
PHP 4 から PHP 5.0.x への移行
PHP Manual

## 下位互換性のない変更点

多くの既存の 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 を読みこむ場合でもファイルは一度だけ読みこまれます。

例1 strrpos() と strripos() は、 needleとして文字列全体を使用する

`<?php
var_dump(strrpos('ABCDEF','DEF')); //int(3)
var_dump(strrpos('ABCDEF','DAF')); //bool(false)
?>`

例2 プロパティを持たないオブジェクトはもはや"空"とはみなされない

`<?php
class 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';
}
}
?>`

PHP 5.0.x における変更点
CLI と CGI
PHP 4 から PHP 5.0.x への移行
PHP Manual