2024年PHP日本大会

向后不兼容更改

PHP核心

Heredoc/Nowdoc结束标签解释

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

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

继续针对Switch语句的问题警告

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

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

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

类型为$obj["123"]的数组访问,其中$obj实现ArrayAccess并且"123"是整数字符串字面量,将不再导致隐式转换为整数,即,将调用$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)
?>
这使得引用和非引用的行为一致。请注意,在单个表达式内读取和写入值仍然是未定义的行为,并且将来可能会再次更改。

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

参数解包停止与具有非整数键的Traversable一起工作。以下代码在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列的小数秒(例如,使用微秒时的TIMESTAMP(6))。以前,返回值中会简单地省略小数秒部分。请注意,这仅影响在关闭模拟准备的情况下使用PDO_MYSQL的情况(例如,使用原生准备功能)。使用具有PDO::ATTR_EMULATE_PREPARES=true(这是默认值)的连接的语句不受此已修复的bug的影响,并且已经从引擎获取正确的小数秒值。

反射

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

标准PHP库 (SPL)

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

SimpleXML

涉及SimpleXML对象的数学运算现在将文本视为intfloat,具体取决于哪个更合适。以前,值始终被无条件地视为int

传入的Cookie

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

添加备注

用户贡献的注释

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