新增命名参数的功能。
新增注解的功能。
新增对构造器属性提升(在构造函数中声明类的属性)的支持。
新增联合类型。
新增 match
表达式。
新增 Nullsafe 运算符(?->
)。
新增 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 interface,当类定义 __toString() 方法后会自动实现该接口。
Trait 可以定义私有抽象方法(abstract private method)。类必须实现 trait 定义的该方法。
可作为表达式使用 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)
exception 而无需捕获到变量中。
支持 mixed 类型。
父类中声明的私有方法不在对子类中的方法执行任何继承规则(final private 构造方法除外)。下列示例说明删除了那些限制:
<?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
。
新增新遍历和操作 API:DOMParentNode 和 DOMChildNode。
新增 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
参数已经从接受 int
变更为接受 bool。
PhpToken 为分词器(tokenizer)新增基于对象的接口。表现更为统一且符合人体工程学,同时内存效率更高、速度更快。
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 中列出。