2024年PHP开发者大会日本站

新特性

PHP核心

属性钩子

对象属性现在可以与其`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自身提供的功能中现有的弃用已更新为使用此属性,通过包含简短说明来改进发出的错误消息。

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

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

无需括号链接new表达式

带有构造函数参数的新表达式现在可以解引用,这意味着它们允许链接方法调用、属性访问等,而无需将表达式括在括号中。

改进WeakReference的调试信息

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

改进Closure的调试信息

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

在不同的命名空间块中定义相同的符号

退出命名空间现在会清除已看到的符号。这允许在命名空间块中使用符号,即使之前的命名空间块声明了名称相同的符号。

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选项,它接受一个callable,在请求生命周期中使用CurlHandle对象、包含调试消息类型的整数和包含调试消息的字符串来调用。调试消息类型是以下常量之一

设置此选项后,CURLINFO_HEADER_OUT必须不设置,因为它使用相同的libcurl功能。

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

DOM

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

添加了 DOMNode::compareDocumentPosition() 及其关联的常量

现在可以将任何可调用对象传递给 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

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

添加了对驱动程序特定 SQL 解析器的支持。默认解析器支持

  • 使用双倍字符作为转义机制的单引号和双引号文本
  • 双破折号和非嵌套 C 样式注释

PDO_MYSQL

添加了支持自定义解析器,支持

  • 使用双倍字符和反斜杠作为转义机制的单引号和双引号文本
  • 反引号文本标识符,并使用双倍字符作为转义机制
  • 两个破折号后跟至少一个空格、非嵌套 C 样式注释和哈希注释

PDO_PGSQL

添加了支持自定义解析器,支持

  • 使用双倍字符作为转义机制的单引号和双引号文本
  • C 样式“转义”字符串文本 (E'string')
  • 美元引号字符串文本
  • 双破折号和 C 样式注释(非嵌套)
  • 支持 ?? 作为 ? 运算符的转义序列

PDO_SQLITE

添加了支持自定义解析器,支持

  • 单引号、双引号和反引号文本,使用双倍字符作为转义机制
  • 方括号引用标识符
  • 双破折号和 C 样式注释(非嵌套)

Phar

添加了对 Zip 存档的 Unix 时间戳扩展的支持。

Readline

添加了通过 PHP_HISTFILE 环境变量更改 .php_history 路径的功能。

SOAP

添加了对类映射中命名空间的 clark 表示法的支持。现在可以使用 clark 表示法在类映射中指定条目,以将具有特定命名空间的类型解析为特定类。例如:'{http://example.com}foo' => 'FooClass'

传递给 xsd:datetime 或类似元素的 DateTimeInterface 实例现在将按此方式序列化,而不是序列化为空字符串。

会话持久性现在可以使用共享会话模块。

Standard

添加了一个新的 RoundingMode 枚举,与 PHP_ROUND_* 常量相比,它具有更清晰的命名和改进的可发现性。此外,还添加了四种新的舍入模式,这些模式只能通过新的 RoundingMode 枚举使用。

XSL

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

现在可以将任何可调用对象传递给 XSLTProcessor::registerPhpFunctions()

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

Zip

添加了ZipArchive::ER_TRUNCATED_ZIP 常量,该常量在 libzip 1.11 中添加。

添加注释

用户贡献的注释

此页面没有用户贡献的注释。
To Top