对象属性现在可以其 get
和 set
操作中关联相关的附加逻辑。根据用法,这可能会也可能不会使属性变为虚拟属性,即该属性根本没有实际的存储值。
<?php
class Person
{
// “虚拟”属性,可能无法明确设置。
public string $fullName {
get => $this->firstName . ' ' . $this->lastName;
}
// 所有的写入操作都会经过这个挂钩,结果就是写入的内容。
// 读取访问正常。
public string $firstName {
set => ucfirst(strtolower($value));
}
// 所有的写入操作都会经过这个挂钩,它必须写入支持值本身。
// 读取访问正常。
public string $lastName {
set {
if (strlen($value) < 2) {
throw new \InvalidArgumentException('Too short');
}
$this->lastName = $value;
}
}
}
$p = new Person();
$p->firstName = 'peter';
print $p->firstName; // 打印“Peter”
$p->lastName = 'Peterson';
print $p->fullName; // 打印“Peter Peterson”
现在可以将对象属性的 set
可见性和 get
可见性分开控制。
<?php
class Example
{
// 第一个可见性修饰符控制 get 可见性,第二个修饰符控制 set 可见性。
// The get-visibility must not be narrower than set-visibility.
public protected(set) string $name;
public function __construct(string $name)
{
$this->name = $name;
}
}
现在可以创建对象,将初始化延迟到访问时。库和框架可以利用这些惰性对象来延迟获取初始化所需的数据或依赖项。
<?php
class Example
{
public function __construct(private int $data)
{
}
// ...
}
$initializer = static function (Example $ghost): void {
// 获取数据或者依赖项
$data = ...;
// 初始化
$ghost->__construct($data);
};
$reflector = new ReflectionClass(Example::class);
$object = $reflector->newLazyGhost($initializer);
#[\Deprecated]
注解
新的 Deprecated 属性可用于将函数、方法和类常量标记为已弃用。此弃用属性的行为与 PHP
本身提供的现有弃用机制的行为一致。唯一的例外是发出的错误代码是 E_USER_DEPRECATED
,而不是
E_DEPRECATED
。
PHP 本身提供的现有弃用已更新为使用该属性,通过包含简短的解释来改进发出的错误消息。
添加 request_parse_body() 函数允许在非 POST HTTP 请求中解析 RFC1867(multipart)请求。
new
表达式不再需要括号具有构造函数参数的新表达式现在可解除引用(dereferencable),这意味着无需将表达式括在括号中,可以直接链接方法调用、属性访问等。
获取 WeakReference 的调试信息现在还会输出其引用的对象,如果引用不再有效,则输出 null
。
Exiting a namespace now clears seen symbols. This allows using a symbol in a namespace block, even if a previous namespace block declared a symbol with the same name.
curl_version() 返回额外的 feature_list
值,是所有已知 CURL 功能的滚脸上数组,值是支持(true
)或者不支持(false
)。
新增 CURL_HTTP_VERSION_3
和 CURL_HTTP_VERSION_3ONLY
常量(自 libcurl 7.66 和 7.88 起可用)作为 CURLOPT_HTTP_VERSION
的可用选项。
新增 CURLOPT_PREREQFUNCTION
作为 cURL 选项,该选项接受在建立连接后但在发送请求之前调用的
callable。此 callable 必须返回 CURL_PREREQFUNC_OK
或
CURL_PREREQFUNC_ABORT
以允许或中止请求。
新增 CURLOPT_SERVER_RESPONSE_TIMEOUT,以前称为 CURLOPT_FTP_RESPONSE_TIMEOUT
。两个常量都具有相同的值。
新增 CURLOPT_DEBUGFUNCTION
作为 cURL 选项,该选项接受在请求生命周期内使用
CurlHandle 对象调用的 callable、包含调试消息类型的整数以及包含调试消息的字符串。调试消息类型是以下常量之一:
CURLINFO_TEXT
CURLINFO_HEADER_IN
CURLINFO_HEADER_OUT
CURLINFO_DATA_IN
CURLINFO_DATA_OUT
CURLINFO_SSL_DATA_IN
CURLINFO_SSL_DATA_OUT
CURLINFO_HEADER_OUT
,因为它使用相同的 libcurl 功能。
curl_getinfo() 现在返回一个额外的 posttransfer_time_us
key,其中包含从开始到发送最后一个字节的微秒数。当重定向之后,每个请求的时间都会加在一起。也可以通过将
CURLINFO_POSTTRANSFER_TIME_T
传递给 curl_getinfo()
option
参数来检索此值。这需要 libcurl 8.10.0 或更高版本。
添加了 Dom 命名空间,其中包含与现有 DOM 类对应的新类(例如,Dom\Node 是新的 DOMNode)。这些类与 HTML 5 兼容,并且符合 WHATWG 规范;解决了 DOM 扩展中长期存在的错误。旧的 DOM 类仍然可用,以实现向后兼容。
新增 DOMNode::compareDocumentPosition() 及其相关常量:
DOMNode::DOCUMENT_POSITION_DISCONNECTED
DOMNode::DOCUMENT_POSITION_PRECEDING
DOMNode::DOCUMENT_POSITION_FOLLOWING
DOMNode::DOCUMENT_POSITION_CONTAINS
DOMNode::DOCUMENT_POSITION_CONTAINED_BY
DOMNode::DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC
现在可以将任何 callable 传递给
DOMXPath::registerPhpFunctions()。
此外,现在使用 DOMXPath::registerPhpFunctionNs() 可以注册使用原生函数调用语法,而不是使用
php:function('name')
。
新增 NumberFormatter::ROUND_HALFODD
来补充现有的 NumberFormatter::ROUND_HALFEVEN
功能。
添加了对基于 Curve25519 + Curve448 密钥的支持。具体来说 openssl_pkey_new()、openssl_pkey_get_details()、openssl_sign() 和 openssl_verify() 中支持 x25519、ed25519、x448 和 ed448 字段,并进行了扩展以支持这些密钥。
实现 PASSWORD_ARGON2 密码哈希处理。需要 OpenSSL 3.2 和 NTS 版本。
捆绑的 pcre2lib 已更新至 10.44 版本。因此,添加了 LoongArch JIT 支持,现在允许在与 Perl 兼容项目中的花括号之间使用空格,并且现在支持可变长度的后向断言。
随着 pcre2lib 版本 10.44 的推出,命名捕获组的最大长度已从 32
更改为 128
。
添加了对 r
(PCRE2_EXTRA_CASELESS_RESTRICT)修饰符以及 (?r)
模式修饰符的支持。当与不区分大小写的修饰符 (i
) 一起启用时,表达式会阻止 ASCII 和非 ASCII 字符的混合。
新增对特定驱动程序子类的支持,以便更好地支持特定于数据库的功能。新的类可通过调用 PDO::connect() 方法或直接实例化特定驱动程序子类来实例化。
新增对特定驱动程序的 SQL 解析器的支持。当特定驱动程序解析器不可用时,使用默认解析器。默认解析器支持:
新增自定义解析器支持:
新增自定义解析器支持:
E'string'
)
??
作为 ?
运算符的转义序列
新增自定义解析器支持:
Zip 档案新增对 Unix 时间戳扩展的支持。
新增通过 PHP_HISTFILE 环境变量更改 .php_history
路径的功能。
ReflectionAttribute 现在包含 name 属性,以改善调试体验。
ReflectionClassConstant::__toString() 和 ReflectionProperty::__toString() 现在返回附加的文档注释。
添加了与惰性对象功能相关的多个新方法和常量:
ReflectionClass::SKIP_INITIALIZATION_ON_SERIALIZE
ReflectionClass::SKIP_DESTRUCTOR
Added support for clark notation for namespaces in class map.
It is now possible to specify entries in a class map with clark notation
to resolve a type with a specific namespace to a specific class.
For example: '{http://example.com}foo' => 'FooClass'
.
Instances of DateTimeInterface that are
passed to xsd:datetime
or similar elements are now
serialized as such instead of being serialized as an empty string.
持久会话现在可与共享会话模块一起使用。
新增 RoundingMode 枚举,与 PHP_ROUND_*
常量相比,其命名更清晰,可发现性更高。此外,还添加了四种新的舍入模式,这些模式仅可通过新的 RoundingMode 枚举使用。
现在可以使用包含单引号和双引号的参数。
现在可以将任何 callable 传递给 XSLTProcessor::registerPhpFunctions()。
添加了 XSLTProcessor::$maxTemplateDepth 和 XSLTProcessor::$maxTemplateVars 来控制 XSL 模板计算的递归深度。
新增 ZipArchive::ER_TRUNCATED_ZIP
常量,libzip 1.11 中添加。