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

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

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

喜欢就支持一下吧!

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

女人、金钱和坏事总是新闻

威·柯珀

推荐阅读

前端开发基础:绝对路径与相对路径的概念

本文介绍了前端开发中绝对路径和相对路径的概念,包括定义、示例、优缺点及选择场景,旨在帮助前端开发者有效管理项目文件引用。

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

Laravel 路由缓存问题排查与解决方案

本文讲述在 Laravel + PHP 项目中,使用 php artisan route:cache 缓存路由时部分路由...

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

Composer 如何切换到中国镜像

本文提供了详细的步骤来指导PHP开发者如何将Composer的默认镜像源切换至中国镜像,以加快依赖包的下载速度,包括全局...

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

php获取指定日期的前一天,前一月等日期范围

php获取指定日期的前一天,前一月等日期范围

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

Mysql数据库常见优化建议(持续更新中)

优化数据库是数据库管理员和数据库开发人员的必备技能。Mysql作为和我们平时打交道最多的数据库之一,如何才能让它发挥出最...

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

PHP $_SERVER 超全局变量全面解读:深入挖掘 Web 开发的宝库

深入探索PHP中的$_SERVER超全局变量,包括常用字段解析、安全性考虑及实际应用示例,助力开发者构建更稳定、安全的W...

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

Phpstorm+Phpstudy 搭建xdebug调试

在日常的工作或者学习中,项目调试是是开发过程中不可缺少的存在,他不仅能帮你更直接的作为一个观察者查阅项目运行流程,更重要...

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

查看内存系列命令应用以及介绍【Linux 篇】

在日常运维Linux系统时,物理内存是其中最重要的一方面。Linux 本身提供了少的方法来帮助我们查看相关信息!下面是一...

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