PHP 8.4.1 Released!

下位互換性のない変更点

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デコードされなくなりました。

add a note

User Contributed Notes

There are no user contributed notes for this page.
To Top