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

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

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

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

    <?php
    class C {
        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 リテラル `true`、`false` および `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_peer` を `false` にしてリクエストでのピア証明書の検証を無効化することもできます。 また同じく、ピア名の検証も、コンテキストオプション `verify_peer_name` を `false` にすれば無効化できます。

### 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 を使うべきです。

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open