2024年PHP日本大会

向后不兼容的更改

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扩展已在DateErrorDateException层次结构下引入了Date扩展特定的异常和错误,而不是警告和通用异常。这改进了错误处理,但代价是必须检查错误和异常。

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
  • 当为$step传递0时,将抛出一个更具描述性的ValueError
  • 现在,当对递增范围使用负$step时,将抛出一个ValueError
  • 如果$step是一个可以解释为整数的浮点数,则现在会这样做。
  • 如果任何参数是无穷大或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() 现在会生成字符列表,而不是将另一个输入强制转换为整数(例如 range('9', 'A');)。
<?php
range
('9', 'A'); // PHP 8.3.0 及以后版本输出:["9", ":", ";", "<", "=", ">", "?", "@", "A"]
range('9', 'A'); // PHP 8.3.0 之前版本输出:[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
?>

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

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

SNMP

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

添加注释

用户贡献的笔记

此页面没有用户贡献的笔记。
To Top