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

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

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

喜欢就支持一下吧!

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

读书人上厕所时间长,那不是干肠,是在蹲坑读书;读书人最能忍受老婆的嘟嚷,也不是脾气好,是读书人入了迷两耳如塞。吃饭读书,筷子常会把烟灰缸的烟头送进口里,但不易得脚气病,因为读书时最习惯抠脚丫子。可怜都是蜘蛛般的体形,都是金鱼似的肿眼,没个倾国倾城貌,只有多愁多病身。

贾平凹

推荐阅读

mysql常用函数以及示例

这篇文章将介绍MySQL数据库中最常用的函数,帮助您在数据处理、查询和操作中更加高效。我们将通过实例来演示这些函数的用法...

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

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

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

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

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

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

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

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

深入了解PHP 8.4带来的重大改进,包括更强大的类型系统、属性(Property Hooks)支持、非对称可见性、惰性...

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

[Mysql] 常用语句汇总

mysql学习教程,集合mysql的入门常见语句语法,包括数据以及服务的操作等

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

深入解析 React 和 Vue.js 性能优化策略

本文深入解析了 React 和 Vue.js 的性能优化策略,包括 React 的 React.memo 与 PureC...

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

thinkphp 模型withCount方法如何指定COUNT字段

本文将详细介绍如何在 ThinkPHP 模型中使用 withCount 方法来获取关联模型的计数信息。通过指定 COUN...

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

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

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

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