编程

PHP 8.4 正式发布!

235 2024-11-25 20:34:00

PHP 团队宣布了 PHP 8.4.1 立即可用,这也意味着 PHP 8.4 正式发布。此版本标志着 PHP 语言的最新 minor 版本。

PHP 8.4 带来了许多改进和新功能,如:

属性钩子

对象属性现在可能具有与其 getset 操作相关的附加逻辑。根据使用情况,这可能会也可能不会使属性成为虚拟属性,也就是说,该属性根本没有实际的存储值。

<?php
class Person
{
    // A "virtual" property.  It may not be set explicitly.
    public string $fullName {
        get => $this->firstName . ' ' . $this->lastName;
    }

    // All write operations go through this hook, and the result is what is written.
    // Read access happens normally.
    public string $firstName {
        set => ucfirst(strtolower($value));
    }

    // All write operations go through this hook, which has to write to the backing value itself.
    // Read access happens normally.
    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; // Prints "Peter"
$p->lastName = 'Peterson';
print $p->fullName; // Prints "Peter Peterson"

非对称属性可见性

现在可以将对象属性的 set 可见性和 get 可见性分开控制。

<?php
class Example
{
    // 第一个可见性修饰符控制 get 可见性,第二个修饰符控制 set 可见性。
    // The get-visibility must not be narrower than set-visibility.
    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 本身提供的现有弃用已更新为使用该属性,通过包含简短的解释来改进发出的错误消息。

class 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() instead
echo $phpVersion->getPhpVersion();

PDO

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

新增对特定驱动程序的 SQL 解析器的支持。默认解析器支持:

  • 单引号和双引号文字,使用双引号作为转义机制
  • 双破折号和非嵌套的 C 风格注释
$connection = PDO::connect(
    'sqlite:foo.db',
    $username,
    $password,
); // object(Pdo\Sqlite)

$connection->createFunction(
    'prepend_php',
    static fn ($string) => "PHP {$string}",
); // Does not exist on a mismatching driver.

$connection->query('SELECT prepend_php(version) FROM php');

新的 Pdo\DblibPdo\FirebirdPdo\MySqlPdo\OdbcPdo\PgsqlPdo\Sqlite 的子类可用。

 

有关 PHP 8.4.1 的源代码下载,请访问官方下载页面,Windows 源代码和二进制文件可以在 windows.php.net/download/. 上找到。更改列表记录在 ChangeLog 中。
 

更多关于 PHP 8.4 的相关特性,请查看本站标签 PHP 8.4 - 中的内容