由于引入了灵活的heredoc/nowdoc语法,文档字符串中包含结束标签的内容可能会导致语法错误或解释上的变化。例如在
<?php
$str = <<<FOO
abcdefg
FOO
FOO;
?>
FOO
之前没有任何特殊含义。现在它将被解释为heredoc字符串的结尾,而接下来的FOO;
将导致语法错误。这个问题总是可以通过选择一个在字符串内容中不存在的结束标签来解决。
continue
语句针对switch
控制流结构现在将生成警告。在PHP中,此类continue
语句等效于break
,而在其他语言中则表现为continue 2
。
<?php
while ($foo) {
switch ($bar) {
case "baz":
continue;
// 警告:“continue” 针对 switch 等效于
// “break”。你是否想使用 “continue 2”?
}
}
?>
类型为$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现在将错误类型报告为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
列的小数秒(例如,使用微秒时的TIMESTAMP(6)
)。以前,返回值中会简单地省略小数秒部分。请注意,这仅影响在关闭模拟准备的情况下使用PDO_MYSQL的情况(例如,使用原生准备功能)。使用具有PDO::ATTR_EMULATE_PREPARES
=true
(这是默认值)的连接的语句不受此已修复的bug的影响,并且已经从引擎获取正确的小数秒值。
反射导出到字符串现在使用int
和bool
,而不是分别使用integer
和boolean
。
如果SPL自动加载器抛出异常,则不会执行后续的自动加载器。以前,所有自动加载器都会执行,并且异常会链接在一起。
从PHP 7.3.23开始,出于安全原因,不再对传入Cookie的_名称_进行URL解码。