新的PHP主要版本PHP8预计将于年底发布。它现在正处于非常活跃的开发中,所以在接下来的几个月里,开发速度和开发进程可能会有很大的变化。
在这篇文章中,我会罗列出PHP8中会发生的一些改变:新功能、性能改进和突破性变化。因为PHP8是一个新的主要版本,所以代码及语法向下兼容性会更低。如果您一直保持与最新版本保持同步,那么升级应该不会太难,因为大多数突破性的更改在7.*版本中都已弃用。
除了突破性的变化,PHP8还带来了一些不错的新特性,比如JIT编译器和uniontypes,当然还有其它更多的特性。
新特性
从新特性开始说起,但是PHP8仍在积极开发中,因此这个清单将随着时间的推移而增长。
联合类型(Uniontypes)RFC
考虑到PHP的动态类型特性,联合类型在很多情况下都很有用。联合类型是两个或多个类型的集合,这些类型指示可以使用这两个类型中的任何一个。
publicfunctionfoo(Foo
Barinput):int
float;我怎么感觉这个和C语言里的联合体有点相似。
请注意,void永远不能是联合类型的一部分,因为它表示“根本没有返回值”。此外,可以使用
NULL或使用现有的?。
publicfunctionfoo(Foo
nullfoo):void;
publicfunctionbar(?Barbar):void;
JITRFC
JIT-Just-In-Time编译器承诺显著提高性能,尽管在Web应用可能没有较大的好处。在这一点上还没有任何准确的基准,但它们肯定会出现的。
静态返回类型(Staticreturntype)RFC
虽然已经可以返回self,但在PHP8之前,静态不是有效的返回类型。考虑到PHP的动态类型特性,它对许多开发人员都很有用。
classFoo
{
publicfunctiontest():static{returnnewstatic();}
}
弱映射(Weakmaps)RFC
基于在PHP7.4中添加的WeakRefsRFC的基础上,在PHP8中添加了WeakMap实现。WeakMap包含对对象的引用,这不会阻止这些对象被垃圾回收。
以ORM为例,它们经常实现包含对实体类的引用的缓存,以提高实体之间关系的性能。这些实体对象不能被垃圾回收,只要该缓存有对它们的引用,即使缓存是唯一引用它们的东西。
如果该缓存层改为使用弱引用和映射,则PHP将在其他对象不再引用这些对象时对它们进行垃圾回收。特别是在ORM的情况下,它可以在一个请求中管理数百个(如果不是数千个)实体;弱映射可以提供一种更好、更资源友好的方式来处理这些对象。
以下是Weakmaps的用法,RFC中的一个示例:
classFoo{privateWeakMapcache;publicfunctiongetSomethingWithCaching(objectobj):object{returnthis-cache[obj]??=this-