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

### number_format() は負のゼロを返さない

以前のバージョンでは、number_format() 関数が -0 を返せました。 これは IEEE 754 浮動小数点標準規格に沿ったまったく問題のない値ですが、 人間が読みやすい形式に数値をフォーマットするという意味では少し不自然でした。

`<?php
var_dump(number_format(-0.01)); // string(2) "-0" ではなく string(1) "0" となります`

### オブジェクトと配列の型変換における数値キーの扱い

配列からオブジェクトへのキャストやその逆のキャストにおける、数値キーの扱いが改善されました。 明示的なキャストだけではなく settype() を使った場合も同様です。

数値キーの配列をオブジェクトにキャストしたときに、その要素にアクセスできるようになったのです。

`<?php
// 配列からオブジェクトへの変換
$arr = [0 => 1];
$obj = (object)$arr;
var_dump(
$obj,
$obj->{'0'}, // アクセスできるようになりました
$obj->{0} // アクセスできるようになりました
);`

上の例の出力は以下となります。

    object(stdClass)#1 (1) {
      ["0"]=>    // 数値キーではなく、文字列のキーになりました
      int(1)
    }
    int(1)
    int(1)

また、オブジェクトに数値のキーが含まれる場合に、 配列にキャストしてもその要素にアクセスできるようになりました。

`<?php
// オブジェクトから配列への変換
$obj = new class {
public function __construct()
{
$this->{0} = 1;
}
};
$arr = (array)$obj;
var_dump(
$arr,
$arr[0], // アクセスできるようになりました
$arr['0'] // アクセスできるようになりました
);`

上の例の出力は以下となります。

    array(1) {
      [0]=>    // 文字列のキーではなく、整数のキーになります
      int(1)
    }
    int(1)
    int(1)

### get_class() に `NULL` を渡せない

以前のバージョンでは、get_class() に `NULL` を渡すと、そのコンテキストの外側のクラスを返していました。 この機能は削除され、`NULL` を渡すと `E_WARNING` が発生するようになりました。 以前と同様の挙動を実現したい場合は、`NULL` を渡すのではなく単にパラメータを省略するようにしましょう。

### countabe ではない型をカウントしたときの警告

countable ではない型に対して count() (およびそのエイリアスである sizeof()) を使ったときに `E_WARNING` が発生するようになりました。

`<?php
var_dump(
count(null), // NULL はカウントできません
count(1), // integer はカウントできません
count('abc'), // string はカウントできません
count(new stdclass), // Countable インターフェイスを実装していないオブジェクトはカウントできません
count([1,2]) // array はカウントできます
);`

上の例の出力は以下となります。

    Warning: count(): Parameter must be an array or an object that implements Countable in %s on line %d

    Warning: count(): Parameter must be an array or an object that implements Countable in %s on line %d

    Warning: count(): Parameter must be an array or an object that implements Countable in %s on line %d

    Warning: count(): Parameter must be an array or an object that implements Countable in %s on line %d
    int(0)
    int(1)
    int(1)
    int(1)
    int(2)

### ext/hash がリソースからオブジェクトへ

長期にわたるリソースからオブジェクトへの移行作業の一環として、 Hash 拡張モジュールがリソースではなくオブジェクトを使うようになりました。 開発者側から見て特に変わるところはありませんが、もし is_resource() を使ったチェックを行っているのなら、 それを is_object() に書き換える必要があります。

### SSL/TLS のデフォルトの改善

デフォルト設定が以下のように変わりました。

- tls:// が、TLSv1.0 や TLSv1.1 や TLSv1.2 のデフォルトになりました。
- ssl:// は tls:// のエイリアスになりました。
- STREAM_CRYPTO_METHOD_TLS_* 定数のデフォルトが、 TLSv1.0 だけではなく TLSv1.0 または TLSv1.1 + TLSv1.2 となりました。

### gettype() にクローズ済みのリソースを渡した際の返り値

以前のバージョンでは、 gettype() にクローズ済みのリソースを渡すと、"unknown type" という文字列を返していました。 これからは、 "resource (closed)" という文字列が返されます。

### is_object() と __PHP_Incomplete_Class

以前のバージョンでは、 __PHP_Incomplete_Class クラスに対して、 is_object() を使うと `FALSE` が返されていました。 これからは `TRUE` が返されます。

### 定義されていない定数のエラーレベル変更

定義されていない定数への参照を行った場合、 `E_WARNING` を生成するようになりました。 (今までは `E_NOTICE`を生成していました。) 次のPHPメジャーバージョンでは、Error 例外を生成するように変更される予定です。

### Windows サポート

現在、公式にサポートしている最低バージョンは Windows 7/Server 2008 R2です。

### trait のプロパティの値チェック

trait のプロパティの値に対して互換性があるかどうかをチェックするときは、値のキャストを行わなくなりました。

### object をクラス名に使う

object という名前は、PHP 7.0 では緩く予約されていました。 PHP 7.2 からは制約が強くなり、クラスや trait、インターフェイスの名前として使うことが禁止されます。

### NetWare サポート

NetWareのサポートが削除されました。

### bcmod() の小数点に対する挙動変更

bcmod() 関数が小数点切り捨てをしないようになりました。 これからは、挙動は % 演算子ではなく、 fmod()に準拠します。 たとえば、 bcmod('4', '3.5') はいままでの1ではなく、 0.5 を返します。

### ハッシュ関数と非暗号化ハッシュ

hash_hmac()、 hash_hmac_file()、 hash_pbkdf2()、 および hash_init() ( `HASH_HMAC`) は非暗号化ハッシュを受け入れないように変更されました。

### json_decode() 関数のオプション

json_decode() 関数のオプション、 `JSON_OBJECT_AS_ARRAY` は、2番めのパラメータ (assoc) が `NULL` の場合に使用されるようになりました。 `JSON_OBJECT_AS_ARRAY` はこれまで無視されていました。

### rand() と mt_rand() の出力

特定のシードで rand() と mt_rand() で生成されたシーケンスは、64-bit マシンで動作しているPHP 7.1と値が異なる場合があります。 (モジュロバイアスのバグ修正が実装されました。).

### `sql.safe_mode` のini設定削除

`sql.safe_mode` のini設定が削除されました。