PHP 8.3.0 RC 6 available for testing

不向下兼容的变更

PHP 核心

Heredoc/Nowdoc 结束标记解释

由于引入了灵活的 heredoc/nowdoc 语法,正文中包含结束标记的文档字符串可能会导致语法错误或解释发生变化。例如在:

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

Switch 中使用 Continue 会发出警告

switch 控制流结构使用 continue 语句现在将生成警告。在 PHP 中,continue 语句相当于 break,而在其它语言中它们的行为等同于 continue 2

<?php
while ($foo) {
switch (
$bar) {
case
"baz":
continue;
// Warning: "continue" targeting switch is equivalent to
// "break". Did you mean to use "continue 2"?
}
}
?>

Strict Interpretation of Integer String Keys on ArrayAccess

Array accesses of type $obj["123"], where $obj implements ArrayAccess and "123" is an integer string literal will no longer result in an implicit conversion to integer, i.e., $obj->offsetGet("123") will be called instead of $obj->offsetGet(123). This matches existing behavior for non-literals. The behavior of arrays is not affected in any way, they continue to implicitly convert integral string keys to integers.

Static Properties no longer separated by Reference Assignment

In PHP, static properties are shared between inheriting classes, unless the static property is explicitly overridden in a child class. However, due to an implementation artifact it was possible to separate the static properties by assigning a reference. This loophole has been fixed.

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

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

var_dump(Test::$x, Test2::$x);
// Previously: int(0), int(1)
// Now: int(1), int(1)
?>

References returned by Array and Property Accesses are immediately unwrapped

References returned by array and property accesses are now unwrapped as part of the access. This means that it is no longer possible to modify the reference between the access and the use of the accessed value:

<?php
$arr
= [1];
$ref =& $arr[0];
var_dump($arr[0] + ($arr[0] = 2));
// Previously: int(4), Now: int(3)
?>
This makes the behavior of references and non-references consistent. Please note that reading and writing a value inside a single expression remains undefined behavior and may change again in the future.

Argument Unpacking of Traversables with non-Integer Keys no longer supported

Argument unpacking stopped working with Traversables with non-integer keys. The following code worked in PHP 5.6-7.2 by accident.

<?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(),现在将报告为 notice。

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() and bcpow() now return numbers with the requested scale. Formerly, the returned numbers may have omitted trailing decimal zeroes.

IMAP、POP3 和 NNTP

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

多字节字符串

由于增加了对命名捕获的支持,使用命名捕获的 mb_ereg_*() 模式的行为会有所不同。特别是命名捕获将成为匹配的一部分,并且 mb_ereg_replace() 将说明额外语法。有关详细信息,请参阅命名捕获

MySQL 扩展提升

预处理语句现在可以正确报告带有小数位数说明符的 DATETIMETIMETIMESTAMP 列的带小数的秒(例如,使用微秒时为 TIMESTAMP(6))。以前,返回值中简单地省略了秒的小数部分。

MySQL 函数(PDO_MYSQL)

预处理语句现在可以正确报告带有小数位数说明符的 DATETIMETIMETIMESTAMP 列的带小数的秒(例如,使用微秒时为 TIMESTAMP(6))。以前,返回值中简单地省略了秒的小数部分。请注意,这仅影响关闭模拟预处理时 PDO_MYSQL 的使用(例如使用原生预处理功能)。使用具有 PDO::ATTR_EMULATE_PREPARES=true(默认值)的连接的语句不受已修复错误的影响,并且已经从引擎获取了带正确小数的秒值。

反射

反射导出为字符串,现在分别使用 intbool 而不是 integerboolean

PHP 标准库(SPL)

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

SimpleXML

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

传入 cookie

从 PHP 7.3.23 起,出于安全原因,传入 cookie 的 names 不再进行 url 解码。

add a note

User Contributed Notes 1 note

up
-2
chris at ocproducts dot com
3 years ago
PCRE has been updated (https://wiki.php.net/rfc/pcre2-migration#backward_incompatible_changes).
The new PCRE version is stricter in some cases.
To Top