php 8.0及以上版本都引入了哪些特性?
PHP 8 及其后续版本(8.1, 8.2, 8.3)引入了一系列强大的新特性,极大地提升了语言的表现力、类型安全性和性能。下面我将为你详细梳理每个版本的主要新特性。
PHP 8.0 - 一次重大的里程碑式更新
PHP 8.0 是继 PHP 7.0 之后又一个重大版本,引入了 JIT 编译器、联合类型和注解等革命性特性。
1. JIT 编译器
-
描述:Just-In-Time 编译器在运行时将 PHP 操作码编译为机器码并直接执行,绕过 Zend VM,从而在 CPU 密集型任务中带来显著的性能提升。
-
用途:主要用于数学计算、大型数组处理、游戏开发等场景。对于典型的 Web 应用(如 Laravel、WordPress),提升可能不那么明显。
-
配置:在
php.ini中通过opcache.jit选项控制。
2. 联合类型
-
描述:允许一个参数、属性或返回值声明为多种类型之一。
-
语法:使用
TypeA|TypeB的语法。 -
示例:
3. 注解
-
描述:PHP 原生支持了注解(在其他语言中常称为 Decorators),用于为类、方法、属性等添加元数据。它们由
#[Attr]语法定义,并可通过 Reflection API 读取。 -
示例:
框架(如 Symfony、Laravel)广泛使用它来定义路由、依赖注入等。
4. 匹配表达式
-
描述:
match是switch语句的更强大、更安全的替代品。它是一个表达式,有返回值,不需要break,并且支持严格比较(===)。 -
示例:
5. 构造器属性提升
-
描述:一种更简洁的语法,允许在类的构造器参数中直接定义属性。
-
示例:
6. Nullsafe 运算符
-
描述:
?->运算符在链式调用中,如果某个环节为null,则整个表达式的结果为null,而不会抛出错误。 -
示例:
7. 字符串与数字的比较更合理
-
描述:当比较数字和字符串时,PHP 8 会将字符串转换为数字进行比较,而不是将数字转换为字符串。这解决了之前一些反直觉的比较结果(如
0 == "abc"在 PHP 7 中为true,在 8.0 中为false)。
8. 新增和移除的内置函数/类
-
新增:
str_contains(),str_starts_with(),str_ends_with()等常用字符串函数。 -
移除:一些不推荐使用的功能,如
create_function()。
PHP 8.1 - 枚举、只读属性与 Fibers
1. 枚举
-
描述:PHP 终于有了原生枚举支持!枚举是一种定义一组命名常量的特殊类。
-
类型:
-
纯枚举:不关联标量值。
-
回退枚举:关联一个标量值(字符串或整数)。
-
-
方法:枚举可以有方法和接口。
2. 只读属性
-
描述:
readonly修饰符确保一个属性在初始化后(通常在构造器中)就不能再被修改。 -
示例:
3. Fibers
-
描述:Fibers 为 PHP 带来了轻量级的、用户态的协程,用于管理异步编程和并发。它们本身不提供异步事件循环,而是为像 ReactPHP、Amphp 这样的框架提供了底层构建块。
-
用途:简化异步代码的编写,避免“回调地狱”。
4. 新的数组解包语法
-
描述:使用
...操作符可以对数组字面量进行解包,包括带有字符串键的数组。 -
示例:
5. 交集类型
-
描述:与联合类型相反,它要求一个值同时满足多个类型约束。使用
TypeA&TypeB语法。 -
示例:
6. never 返回类型
-
描述:表示一个函数或方法永远不会返回值,即一定会抛出异常或终止脚本(例如
exit(),die())。 -
示例:
PHP 8.2 - 只读类与独立类型
1. 只读类
-
描述:将整个类声明为
readonly,意味着该类的所有实例属性都是只读的。 -
示例:
2. 独立类型
-
描述:
null、true和false现在可以作为独立类型使用。这在联合类型中特别有用,可以精确表示返回状态。 -
示例:
3. 析取范式类型
-
描述:允许在联合类型中使用交集类型,使得类型声明更加灵活。
-
示例:
4. 常量表达式中的枚举
-
描述:现在可以在常量表达式中使用枚举变量。
-
示例:
5. 新的 Random 扩展
-
描述:提供了一个面向对象的 API 来生成随机数,替代旧的
rand()和mt_rand()。 -
示例:
PHP 8.3 - 渐进式增强
1. 类型化类常量
-
描述:类常量现在可以声明类型,提高了代码的清晰度和类型安全性。
-
示例:
2. 动态获取类常量和枚举成员
-
描述:新增
constant()和enum_case()函数,用于动态地获取常量和枚举成员。 -
示例:
3. 深拷贝 clone
-
描述:新增
__clone魔术方法可以通过readonly修饰符来阻止在克隆时修改属性,实现了深拷贝的语义。 -
示例:
4. 新增 json_validate() 函数
-
描述:在不分配内存的情况下快速验证一个字符串是否是有效的 JSON,比
json_decode()更高效,尤其对于大 JSON 字符串。 -
示例:
5. 更直观的 Randomizer 添加
-
描述:为
Randomizer类添加了新方法,如getBytesFromString(),用于从给定字符串中随机获取字节。 -
示例:
总结
从 PHP 8.0 到 8.3,PHP 语言正在朝着更现代化、更类型安全、性能更高的方向飞速发展。
-
PHP 8.0 是基石,带来了 JIT、联合类型、注解等核心特性。
-
PHP 8.1 填补了重要空白,引入了枚举和只读属性。
-
PHP 8.2 和 8.3 则是在此基础上进行优化和增强,提供了更精细的类型控制和更好的开发者体验。
对于新项目,强烈建议直接从 PHP 8.2 或 8.3 开始。对于现有项目,也应制定计划升级到 PHP 8.x 系列,以享受其带来的性能和安全优势。在升级时,请务必参考官方升级指南,注意不兼容的变更。
本文来自博客园,作者:Carver大脸猫,转载请注明原文链接:https://www.cnblogs.com/carver/articles/19195664

浙公网安备 33010602011771号