艾林博客 - 技术交流与经验分享的个人博客

探索 PHP 8.4 的革新:增强类型系统、惰性初始化与更多新特性

Liner51

Liner51

1个月前更新

随着PHP社区的不断进步,PHP 8.4版本引入了一系列令人兴奋的新特性和改进。本文将深入探讨这些新功能如何提升开发体验和性能优化,并提供代码示例来说明它们的实际应用,同时与以往版本进行对比,更直观地展示区别。

1. 类型系统增强

过去:

在PHP 7.x及之前版本中,虽然已经引入了标量类型声明(如int, float, string, bool),但并不支持混合类型参数或返回值声明,这限制了函数签名的灵活性。

现在:

PHP 8.4增强了类型系统,增加了对混合类型的支持,使得函数可以接受任意类型的参数而不会抛出类型错误,同时保持严格的类型检查。此外,隐式可为null的类型被弃用,要求显式声明可空类型。

<?php
// PHP 8.4 及之后
function printValue(mixed $value): void {
    echo $value;
}

printValue("Hello, World!"); // 输出字符串
printValue(42); // 输出整数
?>

// 显式声明可空类型
function save(?Book $book = null) {}

2. 属性(Property Hooks)与接口定义

过去:

在之前的版本中,开发者需要手动编写getter和setter方法来控制属性的访问逻辑,而且不能直接在接口中定义属性。

现在:

PHP 8.4引入了Property Hooks,允许覆盖类属性的默认获取与设置行为,从而简化了业务逻辑的实现。同时,可以在接口中定义带有get和set钩子的属性,使代码更加简洁。

<?php
interface HasId {
    public string $id { get; set; }
}

class Foo implements HasId {
    function __construct(
        public string $id {
            get => '#' . $this->id;
            set (string $id) => $this->id = mb_strtoupper($id);
        },
    ) {}
}

3. 非对称可见性

过去:

在旧版本中,属性的可见性是统一的,即一个属性要么完全公开,要么受保护或私有,无法针对读写操作分别设置不同的可见性级别。

现在:

PHP 8.4允许根据相关操作是读取还是写入属性,对同一属性设置不同的可见性。例如,可以定义读取访问的公共可见性和写入访问的更受限的可见性(受保护或私有)。

<?php
class Bar {
    function __construct(
        public private(set) string $id,
    ) {}
}

4. 惰性对象初始化

过去:

在旧版本中,惰性加载通常需要通过复杂的模式实现,比如Proxy或Ghost模式,这涉及到额外的类和方法。

现在:

PHP 8.4通过在Reflection API中添加方法保留和访问,简化了惰性对象的创建过程。开发者可以通过特定的构造逻辑延迟对象实例化,直到实际需要时才进行。

5. 去括号链式调用

过去:

为了链式调用方法,必须先将新对象的创建包裹在括号内,然后才能继续调用其他方法。

现在:

PHP 8.4允许直接在新表达式上调用链式方法,无需额外的括号,减轻了语法负担并提高了代码的可读性。

<?php
// 旧方式
$name = (new ReflectionClass($objectOrClass))->getShortName();

// 新方式
$name = new ReflectionClass($objectOrClass)->getShortName();

6. 多字节字符串处理增强

过去:

多字节字符串处理函数相对有限,导致处理包含多字节字符的字符串时效率较低。

现在:

PHP 8.4引入了诸如mb_ucfirst, mb_lcfirst, mb_trim, mb_ltrimmb_rtrim等函数,确保对多字节字符串正确执行裁剪和更改大小写等操作,解决了从前版本的限制。

<?php
echo mb_ucfirst("translation"); // 输出:“Translation”

7. DOM 扩展支持 HTML5

过去:

DOM扩展仅支持HTML4标准,对于现代Web标准的支持不足。

现在:

PHP 8.4中的DOM扩展进行了重大更新,增加了对HTML5解析与序列化的支持,新的DOM\HTMLDocument类允许开发者无缝处理HTML5内容。

<?php
use DOM\HTMLDocument;
$htmlDocument = HTMLDocument::createFromString('Hello, HTML5!');

8. 更强劲的密码哈希算法

过去:

默认的bcrypt加密级别较低,可能不够安全。

现在:

PHP 8.4将默认的bcrypt加密级别从10提高到12,增强了密码哈希的安全性,使其更能抵抗暴力攻击。

9. JIT 编译器的改进

过去:

尽管JIT编译已经在PHP 8.0中出现,但在早期版本中它的效果有限,对于所有类型的PHP脚本优化并不是特别显著。

现在:

PHP 8.4通过更智能的代码优化策略和缓存机制大幅提升了JIT编译器的表现,尤其针对计算密集型任务实现了显著的速度提升。

10. 新增函数与类

PHP 8.4还增加了一系列新的函数和类,包括但不限于:

  • http请求相关:如curl_multi_setopt_array
  • 数学新函数:如gmp_random_bits
  • 日期:如DateTimeImmutable::createFromMutable
  • DOM:如DOM\HTMLDocument
  • 哈希:如password_hash使用Argon2算法
  • 国际编程:如intlcal_get_keyword_values_for_locale
  • 新的字符串处理函数:如mb_str_split
  • 操作缓存:如opcache_reset
  • PCNTL系列函数:如pcntl_async_signals
  • PDO改进:如PDO::ATTR_STATEMENT_CLASS
The End
代码编程

喜欢就支持一下把!

(0)
金钱这东西,只要能够一人的生活就行了,若是多了它会成为遏制人才能的祸害。

诺贝尔

为您推荐