PHP 8.4 发布!

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

非对称可见性

非对称可见性允许为 getset 操作定义不同的作用域:

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\HTMLDocumentDom\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 函数如 bcaddbcsubbcdiv 等,可以直接使用标准运算符(+-/ 等)。

新的 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\MysqlPdo\PgsqlPdo\SqlitePdo\DbLibPdo\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 版本 发布时间 活跃支持至 生命周期终止日期
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 版本发布页面

1 条评论

发表评论

*