向后不兼容变更

PHP 核心

非常接近堆栈溢出的程序

使用超过 zend.max_allowed_stack_size-zend.reserved_stack_size 字节的堆栈(对于纤程为 fiber.stack_size-zend.reserved_stack_size)时,非常接近堆栈溢出的程序现在可能会抛出 Error 异常。

多次执行 proc_get_status()

在 POSIX 系统上,多次执行 proc_get_status() 现在将始终返回正确的值。以前,只有函数的第一次调用返回正确的值。现在,在 proc_get_status() 之后执行 proc_close() 也将返回正确的退出代码。以前,这将返回 -1。在内部,这是通过在 POSIX 系统上缓存结果来实现的。如果需要之前的行为,可以通过检查 proc_get_status() 返回的数组中的 "cached" 键来检查结果是否已缓存。

Zend 最大执行时间

Zend 最大执行时间现在在 Linux 上的 ZTS 构建中默认启用。

使用带有静态属性的 trait

现在,使用带有静态属性的 trait 将重新声明从父类继承的静态属性。这将为当前类创建单独的静态属性存储。这类似于直接向类添加静态属性,而无需使用 trait。

将负索引分配给空数组

将负索引 $n 分配给空数组现在将确保下一个索引为 $n+1 而不是 0

类常量可见性差异检查

从接口继承时,现在会正确检查类常量可见性差异。

键映射到自身的 WeakMap 条目

如果键映射到自身(可能通过传递性),则 WeakMap 条目现在可能会在循环收集期间被删除,前提是键无法访问,除非通过遍历 WeakMap(通过遍历的访问被认为是弱的)。以前,此类条目永远不会被自动删除。

日期

DateTime 扩展引入了 Date 扩展特定的异常和错误,位于 DateErrorDateException 层级结构下,而不是警告和通用异常。这改善了错误处理,但也需要检查错误和异常。

DOM

在没有父节点的节点上调用 DOMChildNode::after()DOMChildNode::before()DOMChildNode::replaceWith() 现在将变为无操作,而不是层次结构异常,这是 DOM 规范要求的行为。

在没有文档的情况下使用 DOMParentNodeDOMChildNode 方法现在可以工作,而不是抛出 DOM_HIERARCHY_REQUEST_ERR DOMException。这与 DOM 规范要求的行为一致。

调用 DOMDocument::createAttributeNS() 而没有指定前缀将错误地创建一个默认命名空间,将元素放在命名空间中而不是属性中。此错误现已修复。

当前缀已用于不同的 URI 时,DOMDocument::createAttributeNS() 以前会错误地抛出 DOM_NAMESPACE_ERRNAMESPACE_ERR DOMException。现在,当存在前缀名称冲突时,它会正确选择不同的前缀。

一些 DOM 类添加了新方法和属性。如果用户类继承自这些类,并声明了具有相同名称的方法或属性,则声明必须兼容。否则,将抛出关于不兼容声明的典型编译错误。有关新实现的方法和属性的列表,请参见 新功能列表新函数

FFI

返回类型为 void 的 C 函数现在返回 null,而不是返回以下对象 object(FFI\CData:void) { }

Opcache

opcache.consistency_checks INI 指令已被删除。此功能在跟踪 JIT 以及继承缓存中已损坏,并且自 PHP 8.1.18 和 PHP 8.2.5 以来一直被禁用,并且没有办法启用它。跟踪 JIT 和继承缓存都可能在脚本被持久化后通过使校验和失效来修改 shm。尝试修复的解决方案跳过了可修改的指针,但由于复杂性而被拒绝。出于这个原因,决定删除该功能。

Phar

现在声明了 Phar 类常量的类型。

标准

range() 函数进行了各种更改

  • objectresourcearray 作为边界输入传递时,现在将抛出 TypeError
  • 0 作为 $step 传递时,将抛出更具描述性的 ValueError
  • 对于递增范围,使用负 $step 时,现在将抛出 ValueError
  • 如果 $step 是可以解释为 int 的浮点数,现在将执行此操作。
  • 如果任何参数是无穷大或 NAN,现在将抛出 ValueError
  • 如果 $start$end 是空字符串,现在将发出 E_WARNING。该值将继续被强制转换为值 0
  • 如果 $start$end 包含多个字节,并且是字符串,则现在将发出 E_WARNING
  • 如果 $start$end 被强制转换为整数,因为另一个边界输入是数字,则现在将发出 E_WARNING。(例如,range(5, 'z');)。
  • 尝试生成字符范围时,如果 $step 是浮点数,则现在将发出 E_WARNING,除非两个边界输入都是数字字符串(例如,range('5', '9', 0.5); 不会产生警告)。
  • range() 现在将生成一个字符列表,如果其中一个边界输入是字符串数字,而不是将另一个输入强制转换为 int(例如,range('9', 'A');)。
<?php
range
('9', 'A'); // ["9", ":", ";", "<", "=", ">", "?", "@", "A"], 自 PHP 8.3.0 起
range('9', 'A'); // [9, 8, 7, 6, 5, 4, 3, 2, 1, 0], 在 PHP 8.3.0 之前
?>

number_format() 现在处理负 $decimals 值,在小数点前将 $num 四舍五入到 abs($decimals) 位数。以前,会忽略负 $decimals 值。

现在,file() 函数的错误检查标志可以捕获所有无效的标志。值得注意的是,以前FILE_APPEND 会被静默接受。

SNMP

现在已经声明了 SNMP 类常量的类型。

添加注释

用户贡献的注释

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