前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >PHP 8.4 发布!

PHP 8.4 发布!

作者头像
沈唁
发布2025-02-26 12:38:40
发布2025-02-26 12:38:40
9100
代码可运行
举报
文章被收录于专栏:沈唁志沈唁志
运行总次数:0
代码可运行

PHP 8.4 是一个重要的版本,它带来了主要的新功能、对构建依赖项和底层库的几项更新,以及相当多的弃用,以消除旧版 PHP 中一些遗留的不良行为和功能。

它包含许多新功能,例如属性钩子、不对称可见性、更新的 DOM API、性能改进、错误修复和常规清理等。

属性钩子和不对称可见性

PHP 8.4 中最重要的功能之一是新增了属性钩子[1] 和为get 和 set 操作分别声明可见性[2] 的功能。

属性钩子

属性钩子允许在访问或设置属性时执行“钩子”逻辑:

代码语言:javascript
代码运行次数:0
复制
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 操作定义不同的作用域:

代码语言:javascript
代码运行次数:0
复制
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 解析支持[3],还包括DOM 规范合规性[4],以及若干小的增强[5],比如添加了对 CSS 选择器的支持。

BCMath 扩展新增Number 类和新函数

PHP 8.4 中的 BCMath 扩展现在支持运算符重载,提供了新的类支持!

代码语言:javascript
代码运行次数:0
复制
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(

新增函数

  • 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 驱动特定子类[23] 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 扩展[24]已从 PHP 核心中解耦,现在作为 PECL 扩展提供,用户可以通过PIE[25] 轻松安装这些扩展。

PHP 发布周期更新

2024 年 4 月,PHP 投票并通过了一项RFC 提案[26],以更新 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 版本发布页面[27]

参考资料

[1]

属性钩子:https://wiki.php.net/rfc/property-hooks

[2]

get 和 set 操作分别声明可见性:https://wiki.php.net/rfc/asymmetric-visibility-v2

[3]

HTML5 解析支持:https://wiki.php.net/rfc/domdocument_html5_parser

[4]

DOM 规范合规性:https://wiki.php.net/rfc/opt_in_dom_spec_compliance

[5]

增强:https://wiki.php.net/rfc/dom_additions_84

[6]

array_find:https://www.php.net/array_find

[7]

array_find_key:https://www.php.net/array_find_key

[8]

array_any:https://www.php.net/array_any

[9]

array_all:https://www.php.net/array_all

[10]

bcdivmod:https://www.php.net/bcdivmod

[11]

bcround:https://www.php.net/array_find_key

[12]

bcceil:https://www.php.net/array_find_key

[13]

bcfloor:https://www.php.net/array_find_key

[14]

mb_trim:https://www.php.net/mb_trim

[15]

mb_ltrim:https://www.php.net/mb_ltrim

[16]

mb_rtrim:https://www.php.net/mb_rtrim

[17]

mb_ucfirst:https://www.php.net/mb_ucfirst

[18]

mb_lcfirst:https://www.php.net/mb_lcfirst

[19]

grapheme_str_split:https://www.php.net/grapheme_str_split

[20]

fpow:https://www.php.net/fpow

[21]

http_get_last_response_headers:https://www.php.net/http_get_last_response_headers

[22]

http_clear_last_response_headers:https://www.php.net/http_clear_last_response_headers

[23]

PDO 驱动特定子类:https://wiki.php.net/rfc/pdo_driver_specific_subclasses

[24]

IMAP、Pspell、OCI8 和 PDO_OCI8 扩展:https://wiki.php.net/rfc/unbundle_imap_pspell_oci8

[25]

PIE:https://qq52o.me/2845.html

[26]

RFC 提案:https://wiki.php.net/rfc/release_cycle_update

[27]

PHP 版本发布页面:https://www.php.net/releases/8.3/index.php

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-11-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 鲁飞 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 属性钩子和不对称可见性
    • 属性钩子
    • 非对称可见性
  • 改进的 HTML5 解析器
  • BCMath 扩展新增Number 类和新函数
  • 新增函数
  • PDO 驱动特定子类
  • 解耦扩展
  • PHP 发布周期更新
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档