PHP Velho Oeste 2024

下位互換性のない変更点

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

  • セーフモード をサポートしなくなりました。セーフモードでの動作を前提とするアプリケーションは、 セキュリティに関する調整が必要となります。
  • マジッククォート が削除されました。 この機能に依存するアプリケーションは、依存しないように修正しないとセキュリティの問題が発生します。 get_magic_quotes_gpc()get_magic_quotes_runtime() は常に FALSE を返すようになりました。set_magic_quotes_runtime() を実行すると、 マジッククォートを有効にしようとして E_CORE_ERROR が発生します。
  • ini 設定 register_globalsregister_long_arrays が削除されました。
  • mbstring.script_encoding が削除されました。代わりに zend.script_encoding を使いましょう。
  • 呼び出し時の参照渡しをサポートしなくなりました。
  • breakcontinue への引数として、変数は使えなくなりました。つまり、 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" で、以前と変わりません。
  • NULLFALSE あるいは空文字列にプロパティを追加してオブジェクトに変換しようとすると、 これまでのような 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() の三番目のパラメータが boolean erase から integer flags に変わりました。 明示的に eraseFALSE を設定しているコードは、PHP 5.4 では期待通りに動きません。 この例 に従って、 PHP 5.3 と 5.4 のどちらでも動くコードを書きましょう。

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

次の関数は PHP から削除されました。

add a note add a note

User Contributed Notes 3 notes

up
40
ky dot patterson at adlinkr dot com
9 years ago
If you have content that is not 100% UTF-8 then TAKE NOTE:

Starting in PHP 5.4 htmlspecialchars() and htmlentities() assume charset=UTF-8 by default AND WILL RETURN BLANK IF YOUR INPUT IS NOT VALID UTF-8.

So if you have a lot of function calls that look like this:
<?php
echo htmlspecialchars($input);
// or
echo htmlentities($input);
?>
i.e. no charset and no flags -- and $input is ISO-8859 (or anything else apart from 7-bit ASCII or UTF-8) -- then PHP 5.4 and 5.5 will return an empty string, and you will be surprised and probably unhappy.

This is apparently a feature, not a bug.
up
30
Chris
11 years ago
Missing some chars like german umlauts after use of htmlspecialchars? That's because the third param encoding has changed it's default value in PHP 5.4 from ISO-8859-1 to UTF-8.

Possible solution #1:
Change your code from this ...
<?php htmlspecialchars( 'äöü' ); ?>
... to this:
<?php htmlspecialchars ( 'äöü' , ENT_COMPAT | ENT_HTML401 , 'ISO-8859-1' ); ?>

Possible solution #2:
Create a wrapper function and replace htmlspecialchars( to i.e. isohtmlspecialchars( with your IDE/editor/shell...

Example of a wrapper function:
<?php
function isohtmlspecialchars( $str ){
   return
htmlspecialchars ( $str , ENT_COMPAT | ENT_HTML401 , 'ISO-8859-1' );
}
?>
up
20
anton at zebooka dot com
10 years ago
It seems that starting of PHP 5.4 you can not override class method with different signature.

Example:
<?php
class A
{
    public function
doSomething($a, $b)
    {
    }
}

class
B extends A
{
    public function
doSomething($c)
    {
    }
}
?>

PHP Strict standards:  Declaration of B::doSomething() should be compatible with A::doSomething(B $a) in Command line code on line 1
To Top