PHP 8.4.2 Released!

新功能

PHP 核心

属性挂钩

对象属性现在可以其 getset 操作中关联相关的附加逻辑。根据用法,这可能会也可能不会使属性变为虚拟属性,即该属性根本没有实际的存储值。

<?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 本身提供的现有弃用已更新为使用该属性,通过包含简短的解释来改进发出的错误消息。

在非 POST HTTP 请求中解析 RFC1867(multipart)请求

添加 request_parse_body() 函数允许在非 POST HTTP 请求中解析 RFC1867(multipart)请求。

链接 new 表达式不再需要括号

具有构造函数参数的新表达式现在可解除引用(dereferencable),这意味着无需将表达式括在括号中,可以直接链接方法调用、属性访问等。

改进了 WeakReference 的调试信息

获取 WeakReference 的调试信息现在还会输出其引用的对象,如果引用不再有效,则输出 null

改进了 Closure 的调试信息

Closure::__debugInfo() 的输出现在包含 Closure 的名称、文件名、和行数。

Defining Identical Symbols in Different Namespace Blocks

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

curl_version() 返回额外的 feature_list 值,是所有已知 CURL 功能的滚脸上数组,值是支持(true)或者不支持(false)。

新增 CURL_HTTP_VERSION_3CURL_HTTP_VERSION_3ONLY 常量(自 libcurl 7.66 和 7.88 起可用)作为 CURLOPT_HTTP_VERSION 的可用选项。

新增 CURLOPT_PREREQFUNCTION 作为 cURL 选项,该选项接受在建立连接后但在发送请求之前调用的 callable。此 callable 必须返回 CURL_PREREQFUNC_OKCURL_PREREQFUNC_ABORT 以允许或中止请求。

新增 CURLOPT_SERVER_RESPONSE_TIMEOUT,以前称为 CURLOPT_FTP_RESPONSE_TIMEOUT。两个常量都具有相同的值。

新增 CURLOPT_DEBUGFUNCTION 作为 cURL 选项,该选项接受在请求生命周期内使用 CurlHandle 对象调用的 callable、包含调试消息类型的整数以及包含调试消息的字符串。调试消息类型是以下常量之一:

一旦设置了此选项,就不能设置 CURLINFO_HEADER_OUT,因为它使用相同的 libcurl 功能。

curl_getinfo() 现在返回一个额外的 posttransfer_time_us key,其中包含从开始到发送最后一个字节的微秒数。当重定向之后,每个请求的时间都会加在一起。也可以通过将 CURLINFO_POSTTRANSFER_TIME_T 传递给 curl_getinfo() option 参数来检索此值。这需要 libcurl 8.10.0 或更高版本。

DOM

添加了 Dom 命名空间,其中包含与现有 DOM 类对应的新类(例如,Dom\Node 是新的 DOMNode)。这些类与 HTML 5 兼容,并且符合 WHATWG 规范;解决了 DOM 扩展中长期存在的错误。旧的 DOM 类仍然可用,以实现向后兼容。

新增 DOMNode::compareDocumentPosition() 及其相关常量:

现在可以将任何 callable 传递给 DOMXPath::registerPhpFunctions()。 此外,现在使用 DOMXPath::registerPhpFunctionNs() 可以注册使用原生函数调用语法,而不是使用 php:function('name')

Intl

新增 NumberFormatter::ROUND_HALFODD 来补充现有的 NumberFormatter::ROUND_HALFEVEN 功能。

OpenSSL

添加了对基于 Curve25519 + Curve448 密钥的支持。具体来说 openssl_pkey_new()openssl_pkey_get_details()openssl_sign()openssl_verify() 中支持 x25519、ed25519、x448 和 ed448 字段,并进行了扩展以支持这些密钥。

实现 PASSWORD_ARGON2 密码哈希处理。需要 OpenSSL 3.2 和 NTS 版本。

PCRE

捆绑的 pcre2lib 已更新至 10.44 版本。因此,添加了 LoongArch JIT 支持,现在允许在与 Perl 兼容项目中的花括号之间使用空格,并且现在支持可变长度的后向断言。

随着 pcre2lib 版本 10.44 的推出,命名捕获组的最大长度已从 32 更改为 128

添加了对 r(PCRE2_EXTRA_CASELESS_RESTRICT)修饰符以及 (?r) 模式修饰符的支持。当与不区分大小写的修饰符 (i) 一起启用时,表达式会阻止 ASCII 和非 ASCII 字符的混合。

PDO

新增对特定驱动程序子类的支持,以便更好地支持特定于数据库的功能。新的类可通过调用 PDO::connect() 方法或直接实例化特定驱动程序子类来实例化。

新增对特定驱动程序的 SQL 解析器的支持。当特定驱动程序解析器不可用时,使用默认解析器。默认解析器支持:

  • 单引号和双引号文字,使用双引号作为转义机制
  • 双破折号和非嵌套的 C 风格注释

PDO_MYSQL

新增自定义解析器支持:

  • 单引号和双引号文字,使用双引号作为转义机制
  • 反引号文字标识符并且双写反引号作为转义机制
  • 两个破折号后跟至少 1 个空格、非嵌套的 C 风格注释和哈希注释(以 # 开头的注释)

PDO_PGSQL

新增自定义解析器支持:

  • 单引号和双引号文字,使用双引号作为转义机制
  • C 风格“转义”字符串文字(E'string'
  • dollar-quoted string literals
  • 双破折号和 C 风格注释(非嵌套)
  • 支持 ?? 作为 ? 运算符的转义序列

PDO_SQLITE

新增自定义解析器支持:

  • 单引号、双引号和反引号文字,并带有转义机制
  • 方括号引用标识符
  • 双破折号和 C 风格注释(非嵌套)

Phar

Zip 档案新增对 Unix 时间戳扩展的支持。

Readline

新增通过 PHP_HISTFILE 环境变量更改 .php_history 路径的功能。

SOAP

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 枚举使用。

XSL

现在可以使用包含单引号和双引号的参数。

现在可以将任何 callable 传递给 XSLTProcessor::registerPhpFunctions()

添加了 XSLTProcessor::$maxTemplateDepthXSLTProcessor::$maxTemplateVars 来控制 XSL 模板计算的递归深度。

Zip

新增 ZipArchive::ER_TRUNCATED_ZIP 常量,libzip 1.11 中添加。

添加备注

用户贡献的备注

此页面尚无用户贡献的备注。
To Top