按照发布计划,PHP8将于今年11月26日发布,而原定于6月18日发布的第一个Alpha版本跳票到了今天发布。
PHP8是一个新的主要版本,它引入了一些重大变更,以及许多新特性和性能改进,下边简单介绍一些亮点:
JIT,Just-In-Time,即时编译
最重大的特性非JIT莫属。该特性的研发历时多年,熬过了PHP5与7大版本系列(PHP6项目流产),直到去年3月份才最终通过投票确认将进入PHP8。
JIT是一种编译器策略,它将代码表述为一种中间状态,在运行时将其转换为依赖于体系结构的机器码,并即时执行。在PHP中,这意味着JIT将为ZendVM生成的指令视为中间表述,并以依赖于体系结构的机器码执行,也就是说托管代码的不再是ZendVM,而是更为底层的CPU。
虽然自PHP7.0以来,通过优化核心数据结构HashTable、强化ZendVM中某些操作码与持续改进OPCache的Optimizer组件等具体措施,PHP性能得到了显著提升,但是实际上这些优化似乎已经走到极限了。现在JIT从底层着手,被认为是目前提升PHP性能的最佳出路。
关于引入JIT后的性能对比(以及PHP8整体性能),可以参考一下本月Phoronix的基准测试(注:用的是5月底的源码构建版进行的测试)。
UnionTypes,联合类型
UnionTypes支持接收多个不同类型的值,它是两种或多种类型的集合,使用时可以选择其一。包括PHP在内的开源生态的标准库中使用联合类型非常普遍,PHP支持联合类型,将会允许将更多类型信息从phpdoc迁移至函数签名。可以说,泛型之后,联合类型是目前类型声明系统中最大的突破口。
Attributes,注解
这里的Attributes也就是其它语言中的annotations(注解),它提供了一种向类添加元数据的方法,无需解析文档块。
新的static返回类型
虽然已经可以返回self,但是考虑到PHP具有动态类型的性质,PHP8中支持static返回类型将更加高效,对于许多开发者来说应当非常有用。
WeakMap,弱映射
WeakMaps允许创建从对象到任意值的映射(类似SplObjectStorage),而不会阻止对用作key的对象进行垃圾回收。只要将对象添加到WeakMap中,GC在触发条件时就可以将其占用内存回收。
PHP7.4中,实际上已经引入了对WeakReference(弱引用)的支持。但是,原始的弱引用本身用途有限,而弱映射在实践中更为常用。由于没有提供注册销毁回调的功能,因此无法在PHP弱引用之上实现有效的弱映射。弱映射的一般用例是将数据与单个对象实例相关联,而不强迫它们保持活动状态,避免长时间运行的进程无谓地占用内存。
此外还注意到几个处于投票阶段的特性(也就是可能比较快会并入某个版本中的),像matchexpression(匹配表达式)与使用
或#[]替代的提案都是比较值得