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

https://file-one.7k7s.com//uploads/20240604/89f56a7378e381410f4dfcfab3948775.jpg
陈杰 代码编程 发布于5个月前 更新于3个月前 503

随着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

喜欢就支持一下吧!

版权声明:除却声明转载或特殊注明,否则均为艾林博客原创文章,分享是一种美德,转载请保留原链接,感谢您的支持和理解

天行健,君子以自强不息。

《易经》

推荐阅读

深度解析:PHP Laravel 框架中的缓存策略与优化

深入剖析 PHP Laravel 框架中的缓存策略,涵盖缓存驱动原理、应用场景及优化技巧,助力开发者提升应用性能。

https://file-one.7k7s.com//uploads/20240604/89f56a7378e381410f4dfcfab3948775.jpg
陈杰 03月04日

PHP 代码优化指南:善用命名参数打造清晰可维护的代码

本文全面解析 PHP 8 引入的命名参数特性,详细介绍其优势、最佳实践与注意事项,并结合实际代码示例,帮助开发者编写更优...

https://file-one.7k7s.com//uploads/20240604/89f56a7378e381410f4dfcfab3948775.jpg
陈杰 12月24日

MySQL字符串类型的字段 默认值NULL、空值、Empty String的区别,哪个更好?

本文详细介绍了在MySQL中默认值为NULL、空值和Empty String(空字符串)的区别,并分析了在生产环境下的优...

https://file-one.7k7s.com//uploads/20240604/89f56a7378e381410f4dfcfab3948775.jpg
陈杰 10月29日

PHP 运算符大全(完整详细版)

本文详细介绍了 PHP 中的各种运算符,包括算术运算符、赋值运算符、比较运算符、逻辑运算符、位运算符、字符串运算符、数组...

https://file-one.7k7s.com//uploads/20240604/89f56a7378e381410f4dfcfab3948775.jpg
陈杰 06月17日

什么是模型蒸馏?——用「老师教学生」的方式理解AI

本文通过“老师教学生”的类比,通俗讲解模型蒸馏技术如何将大型AI模型的知识迁移到轻量模型中,深入解析软标签与硬标签的区别...

https://file-one.7k7s.com//uploads/20240604/89f56a7378e381410f4dfcfab3948775.jpg
陈杰 03月06日

深入理解PHP DateTime类:全面指南

本文深入探讨PHP的DateTime类,提供了创建DateTime对象、格式化、修改、时区处理等多个方面的广泛示例代码,...

https://file-one.7k7s.com//uploads/20240604/89f56a7378e381410f4dfcfab3948775.jpg
陈杰 03月15日

提升开发效率:PHPStorm常用插件大全

本文详细介绍了PHPStorm常用的插件,包括了日常开发中的热门插件,帮助开发者提升开发效率和代码质量。

https://file-one.7k7s.com//uploads/20240604/89f56a7378e381410f4dfcfab3948775.jpg
陈杰 06月04日

MySQL全文索引深度剖析:加速您的文本搜索

深入探讨MySQL全文索引,包括其定义、优劣势、使用场景,以及通过实例展示其工作原理。了解如何在大量文本数据中使用全文索...

https://file-one.7k7s.com//uploads/20240604/89f56a7378e381410f4dfcfab3948775.jpg
陈杰 04月20日