PHP 大会日本 2024

向后不兼容的更改

防止 number_format() 返回负零

以前,number_format() 函数可能会返回 -0。虽然这根据 IEEE 754 浮点数规范是完全有效的,但这种奇特之处对于以人类可读的形式显示格式化数字并不理想。

<?php

var_dump
(number_format(-0.01)); // 现在输出 string(1) "0" 而不是 string(2) "-0"

转换对象和数组强制转换中的数字键

将数组强制转换为对象和对象强制转换为数组时(无论是显式强制转换还是通过 settype()),现在对数字键进行了更好的处理。

这意味着现在可以访问数组强制转换为对象时的整数(或字符串整数)键

<?php

// 数组到对象
$arr = [0 => 1];
$obj = (object) $arr;
var_dump(
$obj,
$obj->{'0'}, // 现在可以访问
$obj->{0} // 现在可以访问
);

以上示例将输出

object(stdClass)#1 (1) {
  ["0"]=>    // string key now, rather than integer key
  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]=>    // integer key now, rather than string key
  int(1)
}
int(1)
int(1)

不允许将 null 传递给 get_class()

以前,将 null 传递给 get_class() 函数会输出封闭类的名称。此行为现已删除,取而代之的是会输出 E_WARNING。要实现与之前相同的行为,只需省略参数即可。

在计算不可计算类型时发出警告

当尝试 count() 不可计算类型时,现在将发出 E_WARNING(这包括 sizeof() 别名函数)。

<?php

var_dump
(count(null), // NULL 不可计算
count(1), // 整数不可计算
count('abc'), // 字符串不可计算
count(new stdClass), // 未实现 Countable 接口的对象不可计算
count([1,2]) // 数组可计算
);

以上示例将输出

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 扩展已更新为使用对象而不是资源。对于 PHP 开发人员来说,此更改应该是无缝的,除非已进行 is_resource() 检查(需要更新为 is_object())。

改进 SSL/TLS 默认值

已对默认值进行了以下更改

  • tls:// 现在默认为 TLSv1.0 或 TLSv1.1 或 TLSv1.2
  • ssl://tls:// 的别名
  • STREAM_CRYPTO_METHOD_TLS_* 常量默认为 TLSv1.0 或 TLSv1.1 + TLSv1.2,而不是仅 TLSv1.0

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 版本为 Windows 7/Server 2008 R2。

检查特征的默认属性值

对默认特征属性值的兼容性检查将不再执行强制转换。

object 用于类名

object 名称以前在 PHP 7.0 中是软保留的。现在是硬保留的,禁止将其用作类、特征或接口名称。

NetWare 支持

现在已删除对 NetWare 的支持。

array_unique()SORT_STRING

虽然 array_unique() 以前与 SORT_STRING 一起复制数组并删除非唯一元素(之后没有打包数组),但现在通过添加唯一元素来构建一个新数组。这可能导致不同的数字索引。

bcmod() 浮点数更改

bcmod() 函数不再将小数截断为整数。因此,其行为现在遵循 fmod(),而不是 % 运算符。例如 bcmod('4', '3.5') 现在返回 0.5 而不是 1

哈希函数和非加密哈希

hash_hmac()hash_hmac_file()hash_pbkdf2()hash_init()(使用 HASH_HMAC)函数不再接受非加密哈希。

json_decode() 函数选项

json_decode() 函数选项 JSON_OBJECT_AS_ARRAY 现在在第二个参数 (assoc) 为 null 时使用。以前,始终忽略 JSON_OBJECT_AS_ARRAY

rand()mt_rand() 输出

在 64 位机器上,由 rand()mt_rand() 生成的特定种子序列可能与 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 解码。

添加注释

用户贡献的注释

此页面没有用户贡献的注释。
To Top