PCRE 已更新 (https://wiki.php.net/rfc/pcre2-migration#backward_incompatible_changes).
新的 PCRE 版本在某些情况下更加严格。
由于引入了 灵活的 heredoc/nowdoc 语法,在它们正文中包含结束标签的文档字符串可能会导致语法错误或解释更改。例如,在
<?php
$str = <<<FOO
abcdefg
FOO
FOO;
?>
FOO
之前没有任何特殊含义。现在它将被解释为 heredoc 字符串的结尾,而随后的 FOO;
将导致语法错误。此问题始终可以通过选择在字符串内容中不出现的结束标签来解决。
针对 switch
控制流结构的 continue
语句现在将生成警告。在 PHP 中,此类 continue
语句等效于 break
,而在其他语言中它们的行为类似于 continue 2
。
<?php
while ($foo) {
switch ($bar) {
case "baz":
continue;
// 警告:针对 switch 的 "continue" 等效于
// "break"。您是否想使用 "continue 2"?
}
}
?>
类型为 $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 现在将错误类型报告为 int
和 bool
,而不是分别报告 integer
和 boolean
。
传递给 compact() 的未定义变量现在将被报告为通知。
getimagesize() 和相关函数现在将 BMP 图像的 MIME 类型报告为 image/bmp
,而不是 image/x-ms-bmp
,因为前者已在 IANA 注册(请参阅 » RFC 7903)。
stream_socket_get_name() 现在将返回用方括号括起来的 IPv6 地址。例如,将返回 "[::1]:1337"
,而不是 "::1:1337"
。
BCMath 函数 抛出的所有警告现在都使用 PHP 的错误处理。以前,一些警告直接写入 stderr。
rsh/ssh 登录默认情况下处于禁用状态。如果您想启用它们,请使用 imap.enable_insecure_rsh。请注意,IMAP 库在将邮箱名称传递给 rsh/ssh 命令之前不会对其进行过滤,因此将不受信任的数据传递给此函数并启用 rsh/ssh 是不安全的。
由于添加了对命名捕获的支持,使用命名捕获的 mb_ereg_*()
模式将表现不同。特别是命名捕获将是匹配的一部分,并且 mb_ereg_replace() 将解释额外的语法。请参阅 命名捕获 以获取更多信息。
准备好的语句现在可以正确地报告具有小数位数说明符的 DATETIME
、TIME
和 TIMESTAMP
列的秒小数部分(例如,使用微秒时为 TIMESTAMP(6)
)。以前,秒小数部分只是从返回的值中省略。
准备好的语句现在可以正确地报告带有小数位数的 DATETIME
、TIME
和 TIMESTAMP
列的小数秒。以前,小数秒部分会从返回的值中省略。请注意,这只会影响使用 PDO_MYSQL 且模拟准备关闭(例如,使用原生准备功能)时的用法。使用具有 PDO::ATTR_EMULATE_PREPARES
=true
(默认值)的连接的语句不受此错误的影响,并且已经从引擎中获取正确的小数秒值。
反射导出到字符串现在使用 int
和 bool
,分别代替 integer
和 boolean
。
如果 SPL 自动加载器抛出异常,后续的自动加载器将不会被执行。以前所有自动加载器都会被执行,并且异常会被链接。
从 PHP 7.3.23 开始,出于安全原因,传入的 Cookie 的 *名称* 不再进行 URL 解码。
PCRE 已更新 (https://wiki.php.net/rfc/pcre2-migration#backward_incompatible_changes).
新的 PCRE 版本在某些情况下更加严格。