对象属性现在可以与其`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可见性。get可见性不能比set可见性更窄。
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
表达式带有构造函数参数的新表达式现在可以解引用,这意味着它们允许链接方法调用、属性访问等,而无需将表达式括在括号中。
获取WeakReference的调试信息现在还将输出它引用的对象,如果引用不再有效,则输出null
。
退出命名空间现在会清除已看到的符号。这允许在命名空间块中使用符号,即使之前的命名空间块声明了名称相同的符号。
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选项,它接受一个callable,在请求生命周期中使用CurlHandle对象、包含调试消息类型的整数和包含调试消息的字符串来调用。调试消息类型是以下常量之一
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
键,其中包含从开始到发送最后一个字节的微秒数。如果进行了重定向,则会将每次请求的时间加在一起。此值也可以通过将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
现在可以将任何可调用对象传递给 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 字符的混合使用。
添加了对驱动程序特定子类的支持。此 RFC 为 PDO 添加了子类,以便更好地支持特定于数据库的功能。可以通过调用 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
添加了对类映射中命名空间的 clark 表示法的支持。现在可以使用 clark 表示法在类映射中指定条目,以将具有特定命名空间的类型解析为特定类。例如:'{http://example.com}foo' => 'FooClass'
。
传递给 xsd:datetime
或类似元素的 DateTimeInterface 实例现在将按此方式序列化,而不是序列化为空字符串。
会话持久性现在可以使用共享会话模块。
添加了一个新的 RoundingMode 枚举,与 PHP_ROUND_*
常量相比,它具有更清晰的命名和改进的可发现性。此外,还添加了四种新的舍入模式,这些模式只能通过新的 RoundingMode 枚举使用。
现在可以使用同时包含单引号和双引号的参数。
现在可以将任何可调用对象传递给 XSLTProcessor::registerPhpFunctions()。
添加了 XSLTProcessor::$maxTemplateDepth 和 XSLTProcessor::$maxTemplateVars 来控制 XSL 模板评估的递归深度。
添加了ZipArchive::ER_TRUNCATED_ZIP
常量,该常量在 libzip 1.11 中添加。