下位互換性のない変更点
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
を渡すのではなく単にパラメータを省略するようにしましょう。
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_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設定が削除されました。
date_parse() と date_parse_from_format() 関数への変更
date_parse() 関数 と
date_parse_from_format() 関数
が返す zone
要素は、
分ではなくて秒を表現するようになり、符号も逆になりました。
たとえば -120
分は
7200
秒を意味するようになりました。
外部から入力されるCookie
PHP 7.2.34 以降は、セキュリティ上の理由により、 外部から入力される Cookie の 名前 はurlデコードされなくなりました。