下位互換性のない変更点
既存の PHP5 のコードのほとんどは変更なしで動作するはずですが、 以下の下位互換性のない変更点については注意しましょう。
- セーフモードをサポートしなくなりました。セーフモードでの動作を前提とするアプリケーションは、 セキュリティに関する調整が必要となります。
- マジッククォート が削除されました。 この機能に依存するアプリケーションは、依存しないように修正しないとセキュリティの問題が発生します。 get_magic_quotes_gpc() と get_magic_quotes_runtime() は常に
false
を返すようになりました。set_magic_quotes_runtime() を実行すると、 マジッククォートを有効にしようとしてE_CORE_ERROR
が発生します。 - ini 設定 register_globals と register_long_arrays が削除されました。
- mbstring.script_encoding が削除されました。代わりに zend.script_encoding を使いましょう。
- 呼び出し時の参照渡しをサポートしなくなりました。
- break と continue への引数として、変数は使えなくなりました。つまり、
break 1 + foo() * $bar;
などとは書けなくなったということです。 静的な引数を使うのはもちろん可能で、break 2;
などは使えます。 この変更の副作用として、break 0;
やcontinue 0;
が使えなくなりました。 - htmlspecialchars()、htmlentities() および html_entity_decode() のデフォルトの文字セットが
ISO-8859-1
からUTF-8
に変わりました。出力文字セットを default_charset で変更しても、htmlspecialchars/htmlentities/html_entity_decode のデフォルトには影響が及ばないことに注意しましょう。 この変更を反映させるには、 htmlspecialchars()/htmlentities() をコールするときに、エンコーディングとして "" (空文字列) を指定しなければなりません。 ただ、一般にこの方法はおすすめできません。 この方法を使うと、出力文字セットが実行時の設定に依存してしまうからです。 安全策として、htmlspecialchars()、 htmlentities() および html_entity_decode() をコールするときには文字セットを毎回明示するようにしましょう。 - Date 拡張モジュールにおいて、TZ 環境変数によるタイムゾーンの設定をサポートしなくなりました。
php.ini
設定 date.timezone あるいは date_default_timezone_set() 関数でタイムゾーンを指定しなければなりません。 デフォルトのタイムゾーンが設定されていない場合に推測することがなくなり、 未設定の場合は常に "UTC" とみなしてE_WARNING
を発生させるようになりました。 - $a が文字列の場合に非数値のオフセット (たとえば $a['foo']) を指定したときの isset() の返り値は false、 そして empty() の返り値は true となりました。 そして同時に
E_WARNING
が発生します。オフセットに double や bool そして null を指定した場合はE_NOTICE
が発生します。数値とみなせる文字列を渡した場合 ($a['2']
など) の挙動はこれまでと変わりません。'12.3'
や'5 foobar'
のようなオフセットは非数値とみなされてE_WARNING
が発生しますが、過去との互換性のためにそれぞれ 12 および 5 に変換されることに注意しましょう。 次のようなコードの返す値が変わります。 $str='abc';var_dump(isset($str['x'])); // PHP 5.4 以降では false、5.3 以前のバージョンでは true - 配列を文字列に変換しようとすると
E_NOTICE
が発生するようになりました。 キャストの結果は"Array"
で、以前と変わりません。 -
null
、false
あるいは空文字列にプロパティを追加してオブジェクトに変換しようとすると、 これまでのようなE_STRICT
エラーではなく warning が発生するようになりました。 - スーパーグローバルをパラメータ名として使うと fatal error となります。つまり
function foo($_GET, $_POST) {}
などのコードは使えなくなります。 - ハッシュアルゴリズム Salsa10 および Salsa20 が削除されました。
- Tiger ハッシュアルゴリズムは、ビッグエンディアンのバイト順を使用するようになりました。 この例に従って、 PHP 5.3 および 5.4 の両方と互換性のあるコードを記述してください。
- array_combine() のパラメータとして空の配列を二つ指定したときの返り値が
false
ではなくarray()
となりました。 - htmlentities() は、アジアの文字に対して使ったときに
E_STRICT
を発行するようになりました。この場合の htmlentities() の挙動が htmlspecialchars() (こちらは以前からそうなっていた) と同じになりました。 - ob_start() の三番目のパラメータが bool
erase
から intflags
に変わりました。 明示的にerase
にfalse
を設定しているコードは、PHP 5.4 では期待通りに動きません。 この例 に従って、 PHP 5.3 と 5.4 のどちらでも動くコードを書きましょう。 - stream_select() 関数は、
read
,write
,except
配列のキーを保存するようになりました。
次に示すキーワードは予約語となり、関数名やクラス名などの識別子の名前として使えなくなりました。
次の関数は PHP から削除されました。
- define_syslog_variables()
- import_request_variables()
- session_is_registered(), session_register() および session_unregister()
- エイリアス mysqli_bind_param(), mysqli_bind_result(), mysqli_client_encoding(), mysqli_fetch(), mysqli_param_count(), mysqli_get_metadata(), mysqli_send_long_data(), mysqli::client_encoding() および mysqli_stmt::stmt()