向后不兼容更改

PHP 内核

Heredoc/Nowdoc 结束标签解释

由于引入了 灵活的 heredoc/nowdoc 语法,在它们正文中包含结束标签的文档字符串可能会导致语法错误或解释更改。例如,在

<?php
$str
= <<<FOO
abcdefg
FOO
FOO;
?>
缩进的 FOO 之前没有任何特殊含义。现在它将被解释为 heredoc 字符串的结尾,而随后的 FOO; 将导致语法错误。此问题始终可以通过选择在字符串内容中不出现的结束标签来解决。

继续针对 Switch 问题发出警告

针对 switch 控制流结构的 continue 语句现在将生成警告。在 PHP 中,此类 continue 语句等效于 break,而在其他语言中它们的行为类似于 continue 2

<?php
while ($foo) {
switch (
$bar) {
case
"baz":
continue;
// 警告:针对 switch 的 "continue" 等效于
// "break"。您是否想使用 "continue 2"?
}
}
?>

严格解释 ArrayAccess 上的整数字符串键

类型为 $obj["123"] 的数组访问,其中 $obj 实现 ArrayAccess"123" 是整数 string 文字,将不再导致隐式转换为整数,即,$obj->offsetGet("123") 将被调用而不是 $obj->offsetGet(123)。这与非文字的现有行为匹配。数组的行为不受任何影响,它们继续将整数字符串键隐式转换为整数。

静态属性不再通过引用赋值分离

在 PHP 中,静态属性在继承类之间共享,除非静态属性在子类中被显式覆盖。但是,由于实现上的一个问题,可以通过分配引用来分离静态属性。此漏洞已修复。

<?php
class Test {
public static
$x = 0;
}
class
Test2 extends Test { }

Test2::$x = &$x;
$x = 1;

var_dump(Test::$x, Test2::$x);
// 之前:int(0), int(1)
// 现在:int(1), int(1)
?>

由数组和属性访问返回的引用会立即被解包

由数组和属性访问返回的引用现在作为访问的一部分被解包。这意味着不再可能在访问和使用访问的值之间修改引用。

<?php
$arr
= [1];
$ref =& $arr[0];
var_dump($arr[0] + ($arr[0] = 2));
// 之前:int(4), 现在:int(3)
?>
这使得引用和非引用的行为一致。请注意,在单个表达式中读取和写入值仍然是未定义的行为,并且将来可能会再次更改。

不再支持具有非整数键的可遍历对象的解包参数

解包参数在具有非整数键的可遍历对象上停止工作。以下代码在 PHP 5.6-7.2 中意外工作。

<?php
function foo(...$args) {
var_dump($args);
}
function
gen() {
yield
1.23 => 123;
}
foo(...gen());
?>

其他

ext_skel 实用程序已完全重新设计,并添加了新的选项,同时删除了一些旧选项。现在它使用 PHP 编写,没有外部依赖关系。

对 BeOS 的支持已删除。

由于在 EH_THROW 模式下自动将警告转换为异常而引发的异常(例如,一些 DateTime 异常)不再填充 error_get_last() 状态。因此,它们现在与手动抛出的异常的工作方式相同。

TypeError 现在将错误类型报告为 intbool,而不是分别报告 integerboolean

传递给 compact() 的未定义变量现在将被报告为通知。

getimagesize() 和相关函数现在将 BMP 图像的 MIME 类型报告为 image/bmp,而不是 image/x-ms-bmp,因为前者已在 IANA 注册(请参阅 » RFC 7903)。

stream_socket_get_name() 现在将返回用方括号括起来的 IPv6 地址。例如,将返回 "[::1]:1337",而不是 "::1:1337"

BCMath 高精度数学

BCMath 函数 抛出的所有警告现在都使用 PHP 的错误处理。以前,一些警告直接写入 stderr。

bcmul()bcpow() 现在返回具有请求精度的数字。以前,返回的数字可能省略了尾随小数零。

IMAP、POP3 和 NNTP

rsh/ssh 登录默认情况下处于禁用状态。如果您想启用它们,请使用 imap.enable_insecure_rsh。请注意,IMAP 库在将邮箱名称传递给 rsh/ssh 命令之前不会对其进行过滤,因此将不受信任的数据传递给此函数并启用 rsh/ssh 是不安全的。

多字节字符串

由于添加了对命名捕获的支持,使用命名捕获的 mb_ereg_*() 模式将表现不同。特别是命名捕获将是匹配的一部分,并且 mb_ereg_replace() 将解释额外的语法。请参阅 命名捕获 以获取更多信息。

MySQL 改进扩展

准备好的语句现在可以正确地报告具有小数位数说明符的 DATETIMETIMETIMESTAMP 列的秒小数部分(例如,使用微秒时为 TIMESTAMP(6))。以前,秒小数部分只是从返回的值中省略。

MySQL 函数 (PDO_MYSQL)

准备好的语句现在可以正确地报告带有小数位数的 DATETIMETIMETIMESTAMP 列的小数秒。以前,小数秒部分会从返回的值中省略。请注意,这只会影响使用 PDO_MYSQL 且模拟准备关闭(例如,使用原生准备功能)时的用法。使用具有 PDO::ATTR_EMULATE_PREPARES=true(默认值)的连接的语句不受此错误的影响,并且已经从引擎中获取正确的小数秒值。

反射

反射导出到字符串现在使用 intbool,分别代替 integerboolean

标准 PHP 库 (SPL)

如果 SPL 自动加载器抛出异常,后续的自动加载器将不会被执行。以前所有自动加载器都会被执行,并且异常会被链接。

SimpleXML

涉及 SimpleXML 对象的数学运算现在将文本视为 intfloat,以更合适者为准。以前的值被无条件地视为 ints。

传入的 Cookie

从 PHP 7.3.23 开始,出于安全原因,传入的 Cookie 的 *名称* 不再进行 URL 解码。

添加注释

用户贡献的注释 1 个注释

chris at ocproducts dot com
4 年前
PCRE 已更新 (https://wiki.php.net/rfc/pcre2-migration#backward_incompatible_changes).
新的 PCRE 版本在某些情况下更加严格。
To Top