已添加对 命名参数 的支持。
已添加对 属性 的支持。
已添加对 构造函数属性提升(在构造函数签名中声明属性)的支持。
已添加对 联合类型 的支持。
已添加对 match
表达式 的支持。
已添加对空安全运算符 (?->
) 的支持。
已添加 WeakMap 类。
已添加 ValueError 类。
现在可以使用可变参数替换任意数量的函数参数,只要类型兼容即可。例如,以下代码现在允许:
<?php
class A {
public function method(int $many, string $parameters, $here) {}
}
class B extends A {
public function method(...$everything) {}
}
?>
static(如“延迟静态绑定”)现在可以用作返回类型
<?php
class Test {
public function create(): static {
return new static();
}
}
?>
现在可以使用 $object::class
获取对象的类名。结果与 get_class($object)
相同。
new
和 instanceof
现在可以与任意表达式一起使用,使用 new (expression)(...$args)
和 $obj instanceof (expression)
。
已应用一些变量语法的一致性修复,例如现在允许编写 Foo::BAR::$baz
。
添加了 Stringable 接口,如果类定义了 __toString() 方法,则会自动实现此接口。
特质现在可以定义抽象私有方法。使用特质的类必须实现此类方法。
throw
现在可以用作表达式。这允许以下用法:
<?php
$fn = fn() => throw new Exception('Exception in arrow function');
$user = $session->user ?? throw new Exception('Must have user');
参数列表中现在允许使用可选的尾随逗号。
<?php
function functionWithLongSignature(
Type1 $parameter1,
Type2 $parameter2, // <-- 此逗号现在允许。
) {
}
现在可以编写 catch (Exception)
来捕获异常,而无需将其存储在变量中。
已添加对 mixed 类型的支持。
在父类上声明的私有方法不再对子类的方法强制执行任何继承规则(最终私有构造函数除外)。以下示例说明了已删除哪些限制:
<?php
class ParentClass {
private function method1() {}
private function method2() {}
private static function method3() {}
// 抛出警告,因为“final”不再有效:
private final function method4() {}
}
class ChildClass extends ParentClass {
// 以下所有内容现在都允许,即使修饰符与父类中的私有方法不同。
// 与父类中的私有方法的修饰符不同。
public abstract function method1() {}
public static function method2() {}
public function method3() {}
public function method4() {}
}
?>
已添加 get_resource_id(),它返回与 (int) $resource
相同的值。它在更清晰的 API 下提供相同的功能。
已添加 InternalIterator。
已添加 DateTime::createFromInterface() 和 DateTimeImmutable::createFromInterface()。
已添加 DateTime 格式说明符 p
,它与 P
相同,但对于 UTC 返回 Z
而不是 +00:00
。
已添加 DOMParentNode 和 DOMChildNode 以及新的遍历和操作 API。
FILTER_VALIDATE_BOOL
已添加为 FILTER_VALIDATE_BOOLEAN
的别名。新的名称更受青睐,因为它使用规范的类型名称。
已添加 enchant_dict_add()、enchant_dict_is_added() 和 LIBENCHANT_VERSION
。
添加了一个新选项 pm.status_listen
,它允许从不同的端点(例如端口或 UDS 文件)获取状态,这对于在所有子进程都忙于处理长时间运行的请求时获取状态很有用。
现在可以序列化 HashContext 对象。
已添加 IntlDateFormatter::RELATIVE_FULL
、IntlDateFormatter::RELATIVE_LONG
、IntlDateFormatter::RELATIVE_MEDIUM
和 IntlDateFormatter::RELATIVE_SHORT
常量。
已添加 ldap_count_references(),它返回搜索结果中引用消息的数量。
如果启用了 opcache.record_warnings ini 设置,OPcache 将记录编译时警告并在下次包含时重放它们,即使是从缓存中提供服务。
添加了加密消息语法 (CMS) (» RFC 5652) 支持,包括用于加密、解密、签名、验证和读取的函数。该 API 类似于 PKCS #7 函数的 API,并添加了新的编码常量:OPENSSL_ENCODING_DER
、OPENSSL_ENCODING_SMIME
和 OPENSSL_ENCODING_PEM
preg_last_error_msg() 已添加,它返回上次 PCRE 错误的可读消息。它补充了 preg_last_error(),后者返回整数枚举值。
SQLite3::setAuthorizer() 和相应的类常量已添加,用于设置用户级回调,该回调将用于授权或拒绝数据库上的操作。
str_contains()、str_starts_with() 和 str_ends_with() 已添加,它们分别检查 haystack
是否包含、以或以 needle
结尾。
fdiv() 已添加,它在 IEEE 754 语义下执行浮点除法。零除法被认为是定义良好的,并将返回 Inf
、-Inf
或 NaN
之一。
get_debug_type() 已添加,它返回对错误消息有用的类型。与 gettype() 不同,它使用规范类型名称,为对象返回类名,并为资源指示资源类型。
printf() 及其相关函数现在支持 %h
和 %H
格式说明符。它们与 %g
和 %G
相同,但始终使用 "."
作为小数点分隔符,而不是通过 LC_NUMERIC
区域设置确定。
printf() 及其相关函数现在支持使用 "*"
作为宽度或精度,在这种情况下,宽度/精度将作为参数传递给 printf。这也允许使用精度 -1
与 %g
、%G
、%h
和 %H
一起使用。例如,以下代码可用于重现 PHP 的默认浮点格式
<?php
printf("%.*H", (int) ini_get("precision"), $float);
printf("%.*H", (int) ini_get("serialize_precision"), $float);
?>
proc_open() 现在支持伪终端 (PTY) 描述符。以下将 stdin
、stdout
和 stderr
附加到同一个 PTY
<?php
$proc = proc_open($command, [['pty'], ['pty'], ['pty']], $pipes);
?>
proc_open() 现在支持套接字对描述符。以下将不同的套接字对附加到 stdin
、stdout
和 stderr
<?php
$proc = proc_open($command, [['socket'], ['socket'], ['socket']], $pipes);
?>
与管道不同,套接字在 Windows 上不会遇到阻塞 I/O 问题。但是,并非所有程序都能与 stdio 套接字正常工作。
排序函数现在是稳定的,这意味着相等比较的元素将保留其原始顺序。
array_diff()、array_intersect() 及其变体现在可以与单个数组作为参数一起使用。这意味着现在可以使用以下用法
<?php
// 即使 $excludes 为空,也正确:
array_diff($array, ...$excludes);
// 即使 $arrays 只包含一个数组,也正确:
array_intersect(...$arrays);
?>
ob_implicit_flush() 的 flag
参数已更改为接受 bool 而不是 int。
PhpToken 为标记器添加了一个基于对象的接口。它提供了更统一和符合人体工程学的表示,同时更节省内存且速度更快。
Zip 扩展已更新至 1.19.1 版。
新的 ZipArchive::setMtimeName() 和 ZipArchive::setMtimeIndex() 用于设置条目的修改时间。
新的 ZipArchive::registerProgressCallback() 用于在归档关闭期间提供更新。
新的 ZipArchive::registerCancelCallback() 允许在归档关闭期间取消。
新的 ZipArchive::replaceFile() 用于替换条目的内容。
新的 ZipArchive::isCompressionMethodSupported() 用于检查可选的压缩功能。
新的 ZipArchive::isEncryptionMethodSupported() 用于检查可选的加密功能。
已添加 ZipArchive::lastId 属性以获取最后一个添加条目的索引值。
现在可以使用 ZipArchive::status 和 ZipArchive::statusSys 属性或 ZipArchive::getStatusString() 方法在归档关闭后检查错误。
ZipArchive::addGlob() 和 ZipArchive::addPattern() 的 'remove_path'
选项现在被视为任意字符串前缀(与 'add_path'
选项保持一致),而以前则被视为目录名称。
可选压缩/加密功能现在列在 phpinfo 中。