PHP 8.4 正式发布:属性钩子、不对称可见性、改进性能……
时间:2024-11-25 10:51 来源:未知 作者:IT
PHP 8.4 已正式发布,这是一个重要的版本,它带来了主要的新功能、对构建依赖项和底层库的几项更新,以及相当多的弃用,以消除旧版 PHP 中一些遗留的不良行为和功能。

它包含许多新功能,例如属性钩子、不对称可见性、更新的 DOM API、性能改进、错误修复和常规清理等。
属性钩子和不对称可见性
PHP 8.4 中最重要的功能之一是新增了属性钩子和为 get 和 set 操作分别声明可见性的功能。
属性钩子
属性钩子允许在访问或设置属性时执行 “钩子” 逻辑:
class
Locale
{
public string $languageCode;
public string $countryCode
{
set (string $countryCode) {
$this->countryCode = strtoupper($countryCode);
}
}
public string $combinedCode
{
get => \sprintf("%s_%s", $this->languageCode, $this->countryCode);
set (string $value) {
[$this->countryCode, $this->languageCode] = explode('_', $value, 2);
}
}
public
function
__construct(string $languageCode, string $countryCode)
{
$this->languageCode = $languageCode;
$this->countryCode = $countryCode;
}
}
$brazilianPortuguese = new Locale('pt', 'br');
var_dump($brazilianPortuguese->countryCode); // BR
var_dump($brazilianPortuguese->combinedCode); // pt_BR
非对称可见性
非对称可见性允许为 get 和 set 操作定义不同的作用域:
class
PhpVersion
{
public
private(set) string $version = '8.4';
}
$phpVersion = new PhpVersion();
var_dump($phpVersion->version); // string(3) "8.4"
$phpVersion->version = 'PHP 8.3'; // Visibility error
改进的 HTML5 解析器
PHP 8.4 的 DOM 扩展也进行了一次重大功能更新。之前,DOM 扩展仅提供 libxml2 来解析 HTML,而 libxml2 并未跟上 HTML5 的进展。现在,DOM 扩展新增了 Dom\HTMLDocument 和 Dom\XMLDocument 类,其中前者支持 HTML5 合规的解析。
在这一领域有很多新的改进,包括不仅仅是 HTML5 解析支持,还包括 DOM 规范合规性,以及若干小的增强,比如添加了对 CSS 选择器的支持。
BCMath 扩展新增 Number 类和新函数
PHP 8.4 中的 BCMath 扩展现在支持运算符重载,提供了新的类支持!
use
BcMath\Number;
$num1 = new Number('22');
$num2 = new Number('7');
$num3 = new Number('100');
$result = ($num1 / $num2) + $num1 - $num2;
echo $result; // 18.1428571428
现在,不再需要使用 BCMath 函数如 bcadd、bcsub、bcdiv 等,可以直接使用标准运算符(+、-、/ 等)。
新的 BcMath\Number 类支持运算符重载,虽然用户自定义 PHP 类尚不支持此功能,但 BCMath 扩展已经实现了这一点,因此可以像使用常规数字一样使用这些对象。
BcMath\Number 类实现了 Stringable 接口,因此这些对象可以在需要字符串的地方使用(比如上例中的 echo 调用)。此外,该类实现了所有的 bc* 函数。例如,还可以调用 $num->add($num2) 或 $num->add('5'),它会返回一个新的 BcMath\Number 对象,而不会修改原始对象,这使得这些对象是不可变的。
新增函数
-
array_find[6]、array_find_key[7]、array_any[8] 和 array_all[9]
-
bcdivmod[10]、bcround[11]、bcceil[12] 和 bcfloor[13]
-
mb_trim[14]、mb_ltrim[15] 和 mb_rtrim[16]
-
mb_ucfirst[17] 和 mb_lcfirst[18]
-
grapheme_str_split[19]
-
fpow[20]
-
http_get_last_response_headers[21] 和 http_clear_last_response_headers[22]
PDO 驱动特定子类
PDO 驱动特定子类 RFC 已在 PHP 8.4 中实现。它曾在 PHP 8.3 中进行投票,但由于 8.3 的功能冻结,未能实现。
PHP 8.4 现在新增了 Pdo\Mysql、Pdo\Pgsql、Pdo\Sqlite、Pdo\DbLib 和 Pdo\Firebird 类,这些类扩展了 PDO 类。现在可以在驱动特定子类中使用驱动特定的方法、属性和常量。驱动特定的子类还允许通过只接受 / 返回驱动特定的子类来使 API 更加明确和限制。
解耦扩展
IMAP、Pspell、OCI8 和 PDO_OCI8 扩展已从 PHP 核心中解耦,现在作为 PECL 扩展提供,用户可以通过 PIE 轻松安装这些扩展。
PHP 发布周期更新
2024 年 4 月,PHP 投票并通过了一项 RFC 提案,以更新 PHP 的发布周期政策。
此前,PHP 核心团队提供两年活跃支持,然后是一年的安全修复支持。
而现在从 PHP 8.1(2021 年 11 月发布)起,所有 PHP 版本将获得两年安全修复支持,活跃支持期保持两年不变。
此外,活跃支持和生命周期终止(EOL)的日期将调整为日历年的 12 月 31 日,使这些日期更加可预测。
以下是当前 PHP 版本的更新支持和生命周期终止日期,变更部分用加粗标注:
PHP 8.1
2021-11-25
2023-11-25
2025-12-31
PHP 8.2
2022-12-08
2024-12-31
2026-12-31
PHP 8.3
2023-11-23
2025-12-31
2027-12-31
PHP 8.4
2024-11-21
2026-12-31
2028-12-31
PHP 8.5
2025-11
2027-12-31
2029-12-31
PHP 版本
发布时间
活跃支持至
生命周期终止日期
更多信息可以查看 PHP 版本发布页面。
(责任编辑:IT)
PHP 8.4 已正式发布,这是一个重要的版本,它带来了主要的新功能、对构建依赖项和底层库的几项更新,以及相当多的弃用,以消除旧版 PHP 中一些遗留的不良行为和功能。
它包含许多新功能,例如属性钩子、不对称可见性、更新的 DOM API、性能改进、错误修复和常规清理等。 属性钩子和不对称可见性PHP 8.4 中最重要的功能之一是新增了属性钩子和为 get 和 set 操作分别声明可见性的功能。 属性钩子属性钩子允许在访问或设置属性时执行 “钩子” 逻辑: class Locale { public string $languageCode; public string $countryCode { set (string $countryCode) { $this->countryCode = strtoupper($countryCode); } } public string $combinedCode { get => \sprintf("%s_%s", $this->languageCode, $this->countryCode); set (string $value) { [$this->countryCode, $this->languageCode] = explode('_', $value, 2); } } public function __construct(string $languageCode, string $countryCode) { $this->languageCode = $languageCode; $this->countryCode = $countryCode; } } $brazilianPortuguese = new Locale('pt', 'br'); var_dump($brazilianPortuguese->countryCode); // BR var_dump($brazilianPortuguese->combinedCode); // pt_BR 非对称可见性非对称可见性允许为 get 和 set 操作定义不同的作用域: class PhpVersion { public private(set) string $version = '8.4'; } $phpVersion = new PhpVersion(); var_dump($phpVersion->version); // string(3) "8.4" $phpVersion->version = 'PHP 8.3'; // Visibility error 改进的 HTML5 解析器PHP 8.4 的 DOM 扩展也进行了一次重大功能更新。之前,DOM 扩展仅提供 libxml2 来解析 HTML,而 libxml2 并未跟上 HTML5 的进展。现在,DOM 扩展新增了 Dom\HTMLDocument 和 Dom\XMLDocument 类,其中前者支持 HTML5 合规的解析。 在这一领域有很多新的改进,包括不仅仅是 HTML5 解析支持,还包括 DOM 规范合规性,以及若干小的增强,比如添加了对 CSS 选择器的支持。 BCMath 扩展新增 Number 类和新函数PHP 8.4 中的 BCMath 扩展现在支持运算符重载,提供了新的类支持! use BcMath\Number; $num1 = new Number('22'); $num2 = new Number('7'); $num3 = new Number('100'); $result = ($num1 / $num2) + $num1 - $num2; echo $result; // 18.1428571428 现在,不再需要使用 BCMath 函数如 bcadd、bcsub、bcdiv 等,可以直接使用标准运算符(+、-、/ 等)。 新的 BcMath\Number 类支持运算符重载,虽然用户自定义 PHP 类尚不支持此功能,但 BCMath 扩展已经实现了这一点,因此可以像使用常规数字一样使用这些对象。 BcMath\Number 类实现了 Stringable 接口,因此这些对象可以在需要字符串的地方使用(比如上例中的 echo 调用)。此外,该类实现了所有的 bc* 函数。例如,还可以调用 $num->add($num2) 或 $num->add('5'),它会返回一个新的 BcMath\Number 对象,而不会修改原始对象,这使得这些对象是不可变的。 新增函数
PDO 驱动特定子类PDO 驱动特定子类 RFC 已在 PHP 8.4 中实现。它曾在 PHP 8.3 中进行投票,但由于 8.3 的功能冻结,未能实现。 PHP 8.4 现在新增了 Pdo\Mysql、Pdo\Pgsql、Pdo\Sqlite、Pdo\DbLib 和 Pdo\Firebird 类,这些类扩展了 PDO 类。现在可以在驱动特定子类中使用驱动特定的方法、属性和常量。驱动特定的子类还允许通过只接受 / 返回驱动特定的子类来使 API 更加明确和限制。 解耦扩展IMAP、Pspell、OCI8 和 PDO_OCI8 扩展已从 PHP 核心中解耦,现在作为 PECL 扩展提供,用户可以通过 PIE 轻松安装这些扩展。 PHP 发布周期更新2024 年 4 月,PHP 投票并通过了一项 RFC 提案,以更新 PHP 的发布周期政策。 此前,PHP 核心团队提供两年活跃支持,然后是一年的安全修复支持。 而现在从 PHP 8.1(2021 年 11 月发布)起,所有 PHP 版本将获得两年安全修复支持,活跃支持期保持两年不变。 此外,活跃支持和生命周期终止(EOL)的日期将调整为日历年的 12 月 31 日,使这些日期更加可预测。 以下是当前 PHP 版本的更新支持和生命周期终止日期,变更部分用加粗标注:
更多信息可以查看 PHP 版本发布页面。 (责任编辑:IT) |