PHP 8.1 发布:新增枚举功能……

2021 年 11 月 25 日,PHP 开发团队宣布正式发布 PHP 8.1,PHP 8.1 标志着 PHP 语言迎来又一波重大更新。新版本涵盖枚举、只读属性、先进的可调用语法、纤程、交集类型以及性能改进等多项功能特性,其中引入枚举成最大亮点。
PHP 8.1 新特性
枚举
此前 PHP 版本
PHP 8.1
只读属性
此前 PHP 版本
PHP 8.1
只读属性无法在初始化后(即被赋值之后)更改。开发者可以使用只读属性对值对象及数据传输对象进行建模。
先进的可调用语法
此前 PHP 版本
PHP 8.1
现在,开发者可以引用任何函数——即先进的可调用语法。
初始化器更新
此前 PHP 版本
PHP 8.1
对象现可作为默认参数值、静态变量、全局常量以及属性参数使用。这项更改使得嵌套属性成为可能。
此前 PHP 版本
PHP 8.1
纯交集类型
此前 PHP 版本
PHP 8.1
当一个值需要同时满足多种约束类型时,则应使用交集类型。目前开发者还无法将交集类型与 8.0 版本中联合类型混合使用,例如 A&B|C。
Never 返回类型
此前 PHP 版本
PHP 8.1
使用 never 类型声明的函数或方法将不会返回值,且只能通过抛出异常或调用 die()、exit()、trigger_error() 等情况结束脚本执行。
最终类常量
此前 PHP 版本
PHP 8.1
现在可以声明最终类常量,确保它们不会在子类中被覆盖。
显式八进制数字表示法
此前 PHP 版本
PHP 8.1
在开发者可以使用显式 0o 前缀写入八进制数。
纤程(Fibers)
此前 PHP 版本
PHP 8.1
纤程是用于实现轻量级协作并发的原语。这种方法能够创建出如生成器般暂停并恢复代码块的方法,且可以从堆栈中的任何位置处进行。但请注意,纤程本身并不能实现并发性,而仍然需要依靠事件循环。但纤程的出现使得阻塞与非阻塞实现能够共享同一 API。
纤程让开发者摆脱以往常见于 Promiss::then() 或基于生成器的样板代码。各类库大多会围绕纤程构建进一步抽象,因此大家无需直接与这种低级并发机制交互。
使用字符串键解包数组
此前 PHP 版本
PHP 8.1
PHP 之前已经支持通过扩展运算符实现数组解包,但之前只适用于包含整数键的数组。现在,这项功能也可解包字符串键数组。
性能改进
Symfony Demo App 请求时间25 次连续运行,250 次请求(秒)(结果越低越好)
结果(相较于 PHP 8.0):
Symfony Demo 提速 23.0%
WordPress 提速 3.5%
PHP 8.1 中的性能相关变动:
面向 ARM64 的 JIT 后端(AArch64)
继承缓存(避免在各个请求中重新链接类)
快速类名解析(避免小写与哈希查找)
timelib 与 ext/date 性能改进
SPL 文件系统迭代器改进
序列化 / 把序列化优化
对一些内部函数做出优化 (get_declared_classes(), explode(), strtr(), strnatcmp(), dechex())
JIT 改进与修复
新的类、接口与函数
新的 #[ReturnTypeWillChange] 属性。
新的 fsync 与 fdatasync 函数。
新的 array_is_list 函数。
新的 Sodium XChaCha20 函数。
弃用与向下兼容性变动
不推荐将 null 传递至不可为 null 的内部函数参数。
PHP 内置类方法中的 tentative 返回类型。
不推荐使用可序列化接口。
HTML 实体编 / 解码函数默认处理并替换掉单引号。
$GLOBALS 变量约束。
将 MySQLi: Default 错误模式设置为异常。
不推荐使用隐式不兼容的浮点数到整数转换。
finfo 扩展:file_info 资源迁移至现有 finfo 对象。
IMAP:imap 资源迁移至 IMAP\Connection 类对象。
FTP 扩展:Connection 资源迁移至 FTP\Connection 类对象。
GD 扩展:字体标识符迁移至 GdFont 类对象。
LDAP:资源迁移至 LDAP\Connection、LDAP\Result 以及 LDAP\ResultEntry 对象。
PostgreSQL:资源迁移至 PgSql\Connection、PgSql\Result 以及 PgSql\Lob 对象。
Pspell:pspell 与 pspell config 资源迁移至 PSpell\Dictionary 及 PSpell\Config 类对象。
看完本文有收获?点赞、分享是最大的支持!