下位互換性のない変更点

既存の PHP5 のコードのほとんどは変更なしで動作するはずですが、 以下の下位互換性のない変更点については注意しましょう。

  • 引数を解釈する内部API が、PHP 5.3.x に同梱されている全ての拡張機能に 適用されるようになりました。つまり、互換性のないパラメーターが渡された場合、 この引数を解釈するAPIは NULL を関数に返させます。これにはいくつか例外が あります。たとえば get_class() 関数はエラーが起きた場合に 以前と同様 FALSE を返します。
  • clearstatcache() 関数は、デフォルトで絶対パスキャッシュの値をクリアしなくなりました。
  • realpath() 関数はプラットフォーム依存でなくなり、全てのプラットフォーム上で 同じ動作をするようになりました。その結果、 __FILE__ . "/../x" のような無効な相対パスは一切動作しなくなりました。
  • call_user_func() 関数 とその仲間は、呼び出し先が親クラスであっても $this の値を伝播させるようになりました。
  • 配列処理関数 natsort(), natcasesort(), usort(), uasort(), uksort(), array_flip() そして array_unique() は、 引数としてオブジェクトを受け入れなくなりました。オブジェクトを使ってプロパティにアクセス する必要がある場合、オブジェクトを配列型にキャストする必要があります。
  • 引数を参照渡しする関数に値を渡した場合の振る舞いが変更されました。 以前は値渡しとして引数を受け取っていましたが、今は fatal error が発生するようになりました。 参照渡しを期待している関数に定数やリテラルを渡していたコードは、 いったんその値を変数に代入してから関数に渡すよう書き換える必要があります。
  • 新しい mysqlnd ライブラリは、MySQL 4.1 用の41バイトの新しいパスワードフォーマットを使用します。 古い16バイトのパスワードを使うと、mysql_connect() 系の関数は次のようなエラーメッセージを生成します。"mysqlnd cannot connect to MySQL 4.1+ using old authentication"
  • 新しい mysqlnd ライブラリは、mysql の設定ファイル (my.cnf/my.ini) を読み込まなくなりました (以前の libmysqlclient は読み込んでいました)。 もし設定ファイルの内容に依存するコードを書いているのなら、 mysqli_options() 関数で明示的に読み込む必要があります。 つまり、PDO 固有の定数 PDO::MYSQL_ATTR_READ_DEFAULT_FILE および PDO::MYSQL_ATTR_READ_DEFAULT_GROUP は、 PDO の MySQL サポートが mysqlnd でコンパイルしない限り定義されないことになります。
  • SplFileInfoクラス と他のディレクトリ関連クラスは、 末尾の / を除去するようになりました。
  • __toString() マジックメソッドは引数をとらなくなりました。
  • 以下のマジックメソッド __get(), __set(), __isset(), __unset() および __call() は常に public にすべきです。また、static でないメソッドとしても定義できます。 メソッドのシグナチャは強制されます。
  • マジックメソッド __call() は、private や protected のメソッドに対するアクセスでも呼び出されるようになりました。
  • func_get_arg()func_get_args() および func_num_args() は、関数内で includerequire を使って読み込んだファイルのいちばん外側のスコープからは呼び出せないようになりました。
  • MHASH 拡張モジュール用の抽象化レイヤーができ、Hash 拡張モジュールをラップできるようになりました。 しかし、すべてのアルゴリズムをサポートしているわけではありません。 主なところでは s2k ハッシュアルゴリズムには非対応です。 つまり、s2k ハッシュは PHP 5.3.0 以降では使えないということです。

次に示すキーワードは予約語となり、関数名やクラス名などの識別子の名前として使えなくなりました。

add a note add a note

User Contributed Notes 3 notes

up
0
chokolatrix
6 years ago
In PHP 5.3, when accessing a string as an array, if the key was a string (non-existing because, for strings, the keys are integers), first char was returned. Probably it converts the string to integer, therefore to 0.
PHP 5.4 throws a warning.

$article;       // this holds '98765' but you expect an array

// You try to read a value from your "array"
// PHP 5.3 : nothing
// PHP 5.4 : Warning: Illegal string offset at line ...
$value = $article['id_article'];

var_dump($value);              // returns:   string(1) "9"

.
up
0
peterix at gmail dot com
8 years ago
strlen changed in 5.3.0. It no longer returns 5 when called on Arrays.

If you abused this in your codebase, beware.
up
0
Chris Bolt
15 years ago
call_user_func_array() no longer accepts null as a second parameter and calls the function. It now emits a warning and does not call the function.
To Top