下位互換性のない変更点

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_classnull を渡せない

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

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

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のサポートが削除されました。

array_unique 関数を SORT_STRING と使う場合

array_unique 関数を SORT_STRING と使う場合、以前は配列をコピーし、重複した要素を削除 (配列を後にパックせずに) していましたが、このバージョンからは 新しい配列作られ、ユニークな要素を追加するようになりました。 これにより、以前のバージョンとは異なった数値のインデックスが生成されます。

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

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

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

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

json_decode 関数のオプション

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

randmt_rand の出力

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

sql.safe_mode のini設定削除

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

date_parsedate_parse_from_format 関数への変更

date_parse 関数 と date_parse_from_format 関数 が返す zone 要素は、 分ではなくて秒を表現するようになり、符号も逆になりました。 たとえば -120 分は 7200 秒を意味するようになりました。

外部から入力されるCookie

PHP 7.2.34 以降は、セキュリティ上の理由により、 外部から入力される Cookie の 名前 はurlデコードされなくなりました。