向后不兼容的更改

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

改进 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

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

bcmod() 在使用浮点数时的变化

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

哈希函数和非加密哈希

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

json_decode() 函数选项

现在,如果第二个参数(assoc)为 null,则 json_decode() 函数选项 JSON_OBJECT_AS_ARRAY 将被使用。以前,JSON_OBJECT_AS_ARRAY 总是被忽略。

rand()mt_rand() 输出

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