已添加对 命名参数 的支持。
已添加对 属性 的支持。
已添加对 构造函数属性提升(在构造函数签名中声明属性)的支持。
已添加对 联合类型 的支持。
已添加对 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
开头或以 needle
结尾。
fdiv() 已添加,它根据 IEEE 754 语义执行浮点除法。除以零被认为是定义明确的,并将返回 Inf
、-Inf
或 NaN
之一。
get_debug_type() 已添加,它返回对错误消息有用的类型。与 gettype() 不同,它使用规范类型名称,为对象返回类名称,并为资源指示资源类型。
printf() 及其朋友现在支持 %h
和 %H
格式说明符。它们与 %g
和 %G
相同,但始终使用 "."
作为小数点分隔符,而不是通过 LC_NUMERIC
区域设置来确定。
printf() 及其朋友现在支持使用 "*"
作为宽度或精度,在这种情况下,宽度/精度将作为参数传递给 printf。这也允许在使用 %g
、%G
、%h
和 %H
时使用精度 -1
。例如,以下代码可用于复制 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 中。