PHP マニュアル
前のページ | 付録 B. PHP 4 から PHP 5 への移行 | 次のページ

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

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

例 B-1. strrpos() と strripos() は、 needleとして文字列全体を使用する
`<?php var_dump(strrpos('ABCDEF','DEF')); //int(3) var_dump(strrpos('ABCDEF','DAF')); //bool(false) ?>`

例 B-2. プロパティを持たないオブジェクトはもはや"空"とはみなされない
`<?php class test { } $t = new test(); var_dump(empty($t)); // echo bool(false) if ($t) { // 実行される } ?>`

以下の例はPHP 4では有効でしたが、PHP 5では致命的なエラーを 発生します。

例 B-3. クラスは使用前に宣言する必要がある
`<?php $test = new fubar(); $test->barfu(); class fubar { function barfu() { echo 'fubar'; } } ?>`

前のページ | ホーム | 次のページ
PHP 4 から PHP 5 への移行 | 上に戻る | CLI と CGI