新的主要PHP版本PHP 8预计将于2020年末发布。它如今处于很是活跃的开发阶段,因此在接下来的几个月里,事情可能会发生很大的变化。php
在这篇文章中,我将持续更新预期的内容列表:新特性、性能改进和重大变化。由于PHP 8是一个新的主版本,因此您的代码被破坏的概率更高。若是你一直在更新最新的版本,升级应该不会太困难,由于大多数有破坏性的更改在7以前就已经废弃了。*版本。web
除了中断更改以外,PHP 8还带来了一些不错的新特性,好比JIT编译器和union类型;还有更多!缓存
考虑到PHP的动态类型化特性,在不少状况下联合类型是有用的。联合类型是两个或多个类型的集合,这些类型表示其中一个可使用。post
public function foo(Foo|Bar $input): int|float;
注意,void永远不能是union类型的一部分,由于它表示“根本没有返回值”。此外,可使用|null来编写可为空的联合,也可使用现有的?符号:性能
public function foo(Foo|null $foo): void; public function bar(?Bar $bar): void;
即时编译器承诺显著的性能改进,尽管并不老是在web请求的上下文中。目前尚未任何准确的基准,但它们确定会到来。this
虽然已经能够返回self,但静态类型直到PHP 8才成为有效的返回类型。考虑到PHP的动态类型特性,这一特性对许多开发人员都颇有用。scala
class Foo { public function test(): static { return new static(); } }
在PHP 7.4中添加的weakrefs RFC的基础上,在PHP 8中添加了WeakMap实现。弱映射包含对对象的引用,这并不会阻止那些对象被垃圾收集。code
以orm为例,它们一般实现保存对实体类的引用的缓存,以改进实体之间关系的性能。这些实体对象不能被垃圾回收,只要这个缓存有一个对它们的引用,即便缓存是惟一引用它们的东西。orm
若是这个缓存层使用弱引用和映射,那么PHP将在没有其余对象引用它们时对这些对象进行垃圾收集。尤为是orm,它能够在一个请求中管理数百个(若是不是数千个)实体;弱映射为处理这些对象提供了一种更好的、对资源更友好的方法。对象
下面是弱映射的样子,一个来自RFC的例子:
class Foo { private WeakMap $cache; public function getSomethingWithCaching(object $obj): object { return $this->cache[$obj] ??= $this->computeSomethingExpensive($obj); } }
::class
on objects一个小而有用的新特性:如今能够在对象上使用::class,而没必要在对象上使用get_class()。它的工做方式与get_class()相同。
$foo = new Foo(); var_dump($foo::class);
Stringable接口可用于键入提示任何字符串或实现了 tostring()的内容。并且,不管什么时候类实现了 tostring(),它都会在后台自动实现接口,不须要手动实现。
class Foo { public function __toString(): string { return 'foo'; } } function bar(Stringable $stringable) { /* … */ } bar(new Foo()); bar('abc');
您已经可使用DateTime:: createfromimmutabledatetime ($immutableDateTime)从一个datetime对象建立一个DateTime对象,可是另外一种方法比较麻烦。经过添加DateTime::createFromInterface()和datetime::createFromInterface(),如今就有了一种将DateTime和datetime对象相互转换的通用方法。
DateTime::createFromInterface(DateTimeInterface $other); DateTimeImmutable::createFromInterface(DateTimeInterface $other);
许多之前只触发警告或通知的错误如今已经转换为正确的错误。如下警告已更改。