新增命名参数的功能。
新增注解的功能。
新增构造器属性提升功能 在构造函数中声明类的属性)。
新增 联合类型。
新增 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() has been added, which returns the number of reference messages in a search result.
If the opcache.record_warnings ini setting is enabled, OPcache will record compile-time warnings and replay them on the next include, even if it is served from cache.
Added Cryptographic Message Syntax (CMS) (» RFC 5652)
support composed of functions for encryption, decryption, signing, verifying and reading. The API
is similar to the API for PKCS #7 functions with an addition of new encoding constants:
OPENSSL_ENCODING_DER
, OPENSSL_ENCODING_SMIME
and OPENSSL_ENCODING_PEM
:
新增 preg_last_error_msg(),返回最后一条人可读的 PCRE 错误消息。它是对 preg_last_error() (返回整数枚举值)的补充。
SQLite3::setAuthorizer() and respective class constants have been added to set a userland callback that will be used to authorize or not an action on the database.
新增 str_contains()、str_starts_with() 和
str_ends_with(),分别检查 haystack
是否包含 needle
或以 needle
开头/结尾。
fdiv() has been added, which performs a floating-point division under IEEE 754 semantics.
Division by zero is considered well-defined and will return one of Inf
,
-Inf
or NaN
.
get_debug_type() has been added, which returns a type useful for error messages. Unlike gettype(), it uses canonical type names, returns class names for objects, and indicates the resource type for resources.
printf() and friends now support the %h
and
%H
format specifiers. These are the same as %g
and
%G
, but always use "."
as the decimal separator, rather
than determining it through the LC_NUMERIC
locale.
printf() and friends now support using "*"
as width or
precision, in which case the width/precision is passed as an argument to printf. This also allows
using precision -1
with %g
, %G
,
%h
and %H
. For example, the following code can be used to
reproduce PHP's default floating point formatting:
<?php
printf("%.*H", (int) ini_get("precision"), $float);
printf("%.*H", (int) ini_get("serialize_precision"), $float);
?>
proc_open() now supports pseudo-terminal (PTY) descriptors. The following
attaches stdin
, stdout
and stderr
to the
same PTY:
<?php
$proc = proc_open($command, [['pty'], ['pty'], ['pty']], $pipes);
?>
proc_open() now supports socket pair descriptors. The following attaches a
distinct socket pair to stdin
, stdout
and
stderr
:
<?php
$proc = proc_open($command, [['socket'], ['socket'], ['socket']], $pipes);
?>
Unlike pipes, sockets do not suffer from blocking I/O issues on Windows. However, not all programs may work correctly with stdio sockets.
排序函数现在已稳定,这意味着相等的元素比较将保留其原始顺序。
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 中列出。