下位互換性のない変更点

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

配列リテラルを用いてクラスのプロパティに配列を設定した場合、配列のキーが上書きされない

以前のバージョンでは、クラスのプロパティとして宣言されている配列で明示的なキーと暗黙のキーが混在している場合に、 明示的に指定したキーと暗黙の数値キーが重複すると、黙って上書きされていました。以下に、例を示します。

<?php
class {
    const 
ONE 1;
    public 
$array = [
        
self::ONE => 'foo',
        
'bar',
        
'quux',
    ];
}

var_dump((new C)->array);
?>

上の例の PHP 5.5 での出力は、このようになります。

array(2) {
  [0]=>
  string(3) "bar"
  [1]=>
  string(4) "quux"
}

上の例の PHP 5.6 での出力は、このようになります。

array(3) {
  [1]=>
  string(3) "foo"
  [2]=>
  string(3) "bar"
  [3]=>
  string(4) "quux"
}

json_decode() が、より厳格に

json_decode() は、JSON リテラル truefalse および null について、すべて小文字のものしか受け付けなくなりました。 これは、JSON の仕様に基づくものです。小文字以外の場合は、json_last_error() にエラーが設定されます。 以前のバージョンの json_decode() は、大文字が混ざっているものでも受け付けていました。

この変更の影響を受けるのは、無効な形式の JSON を json_decode() に渡していた場合だけです。 妥当な形式の JSON は、この変更の影響を受けず、通常通りに処理されます。

ストリームラッパーが、SSL/TLS を使っている場合のピア証明書とホスト名の検証にデフォルトで対応

暗号化されたすべてのクライアントストリームで、ピア検証がデフォルトで有効になりました。 デフォルトでは、OpenSSL のデフォルト CA バンドルを使ってピア証明書を検証します。 たいていの場合は、正しい SSL 証明書を持つサーバーと通信するならこれを変更する必要はありません。 OpenSSL が、よく知られた CA バンドルを使うように設定されているからです。

デフォルトの CA バンドルを上書きすることもできます。 openssl.cafile あるいは openssl.capath を設定すればグローバルに変更でき、コンテキストオプション cafile あるいは capath を使えばリクエスト単位で変更できます。

一般的にはおすすめできませんが、 コンテキストオプション verify_peerFALSE にしてリクエストでのピア証明書の検証を無効化することもできます。 また同じく、ピア名の検証も、コンテキストオプション verify_peer_nameFALSE にすれば無効化できます。

GMP リソースがオブジェクトに

GMP リソースがオブジェクトになりました。 GMP 拡張モジュールに実装されている API に変更はなく、コードに手を加えなくてもそのまま動作します。 しかし、is_resource() などでリソースかどうかを明示的に調べている場合は注意が必要です。

Mcrypt 関数は、有効なキーと IV を要求する

mcrypt_encrypt()mcrypt_decrypt()mcrypt_cbc()mcrypt_cfb()mcrypt_ecb()mcrypt_generic() および mcrypt_ofb() は、無効なサイズのキーや IV を受け付けなくなりました。 IV が必要なブロック暗号化モードで IV が指定されていない場合にも、処理が失敗するようになりました。

cURL でのファイルアップロード

@file 構文によるファイルアップロードを行う際には、CURLOPT_SAFE_UPLOAD を FALSE に設定しなければいけなくなりました。 この機能を使うのではなく、CURLFile を使うべきです。

add a note add a note

User Contributed Notes 1 note

up
0
Someone
2 days ago
Beware, now default_charset in PHP 5.6 is UTF-8, instead of blank value like in previous versions. So if you use 8-bit charset like iso-8859-1 then your non-ascii characters will be broken until you explicitly set default_charset to blank value or to your actual character set. HTML meta tag doesn't work anymore because HTTP headers have more proirity over them. And Apache AddDefaultCharset directive has lower proirity too.
To Top