PHP 8.4 是 PHP 语言的一次重大更新

今天发文稍晚了些,PHP 开发团队于 11 月 21 日发布 PHP 8.4.1 版本更新,修复了多个关键安全漏洞,并同时引入了诸多改进和新特性,8.4.x 也成为 PHP 语言的最新主要版本。它包含许多新功能,例如属性钩子、不对称可见性、更新的 DOM API、性能改进、错误修复和常规清理等。





1.钩子属性

属性钩子提供对计算属性的支持,这些属性可以被 IDE 和静态分析工具直接理解,而无需编写可能会失效的 docblock 注释。此外,它们允许可靠地预处理或后处理值,而无需检查类中是否存在匹配的 getter 或 setter。
<?phpclass 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->languageCode, $this->countryCode] = explode('_'$value2);         }      }      public function __construct(string $languageCode, string $countryCode) {          $this->languageCode = $languageCode;          $this->countryCode = $countryCode;      }}$brazilianPortuguese new Locale('pt''br');var_dump($brazilianPortuguese->countryCode); // BRvar_dump($brazilianPortuguese->combinedCode);// pt_BR
2.不对称可见性
现在可以独立地控制写入属性的作用域和读取属性的作用域,减少了需要编写繁琐的 getter 方法来公开属性值而不允许从类外部修改属性的需求。
<?phpclass PhpVersion{    public private(set) string $version '8.4';    public function increment(): void    {        [$major$minor] = explode('.'$this->version);        $minor++;        $this->version = "{$major}.{$minor}";   }}
3.#[\Deprecated] 属性
新的 #[\Deprecated] 属性使 PHP 的现有弃用机制可用于用户定义的函数、方法和类常量。
<?phpclass PhpVersion{    #[\Deprecated(        message"use PhpVersion::getVersion() instead",        since"8.4",    )]    public function getPhpVersion(): string {        return $this->getVersion();    }        public function getVersion(): string {                return '8.4';       }}    $phpVersion = new PhpVersion();// Deprecated: Method PhpVersion::getPhpVersion() is deprecated since 8.4, use PhpVersion::getVersion() insteadecho $phpVersion->getPhpVersion();

4.新的 ext-dom 功能和 HTML5 支持

新的 DOM API 包括符合标准的支持,用于解析 HTML5 文档,修复了 DOM 功能行为中的几个长期存在的规范性错误,并添加了几个函数,使处理文档更加方便。新的 DOM API 可以在 Dom 命名空间中使用。使用新的 DOM API 可以使用 Dom\HTMLDocument 和 Dom\XMLDocument类创建文档。

<?php$dom = Dom\HTMLDocument::createFromString(    <<<'HTML'            <main>                  <article>PHP 8.4 is a feature-rich release!</article>                   <article class="featured">PHP 8.4 adds new DOM classes that are spec-compliant, keeping the old ones for compatibility.</article>            </main>            HTML,        LIBXML_NOERROR,);    $node = $dom->querySelector('main > article:last-child');    var_dump($node->classList->contains("featured")); // bool(true)

5.BCMath 的对象 API

新的 BcMath\Number 对象使在处理任意精度数字时可以使用面向对象的方和标准的数学运算符。这些对象是不可变的,并实现了 Stringable 接口,因此以在字符串上下文中使用,如 echo $num。

use BcMath\Number;$num1 = new Number('0.12345');$num2 = new Number('2');$result = $num1 + $num2;echo $result// '2.12345'var_dump($num1 > $num2); // false

6.新的 array_*() 函数

新增函数 array_find()、array_find_key()、array_any() 和 array_all()

$animal = array_find(  ['dog''cat''cow''duck''goose'],  static fn (string $value): bool => str_starts_with($value'c'),);var_dump($animal); // string(3) "cat"
7.新的类、接口和函数
图片

8.弃用和向后不兼容

图片