PHP 8 中新特性以及重大调整

php 8 , PHP 的一个新的大版本 , 预计将于2020年12月3日发布 , 这意味着将不会有 PHP 7.5 版本 。PHP8目前正处于非常活跃的开发阶段 , 所以在接下来的几个月里 , 情况可能会发生很大的变化 。
在这篇文章中 , 我会维持一个最新的清单列表 , 列出预计会出现的新特性、性能提升和突破性的变化 。由于 PHP 8 是一个新的大版本 , 因此您的代码被破坏的可能性更高 。如果您始终保持运行 PHP 的最新版本 , 那么升级相对来说就会轻松很多 , 因为在7. *版本中 , 大多数重大更改均已弃用 。
除重大更改外 , PHP 8还带来了一些不错的新功能 , 比如说 JIT编译器, 联合类型, 属性 , 以及更多 。
新特性从新特性开始 , 请记住 PHP8 仍处于活动开发阶段 , 因此此列表将随着时间的推移而增长 。
联合类型考虑到 PHP 动态语言类型的特性 , 现在很多情况下 , 联合类型都是很有用的 。联合类型是两个或者多个类型的集合 , 表示可以使用其中任何一个类型 。
public function foo(Foo|Bar $input): int|float;
请注意 , 联合类型中不包含 void , 因为void 表示的含义是“根本没有返回值” 。另外 , 可以使用 |null 或者现有的 ? 表示法来表示包含 nullable 的联合体 :
public function foo(Foo|null $foo): void;
public function bar(?Bar $bar): void;
JITJIT — just in time — 编译器虽然不总是在 Web 请求的上下文中 , 但是有望显着地提高性能 。目前还没有完成任何准确的基准测试 , 但是肯定会到来 。
如果您想进一步了解JIT对PHP的作用 , 可以阅读我写过的另一篇文章此处 。
属性属性在其他语言中通常被称为 注解  , 提供一种在无需解析文档块的情况下将元数据添加到类中的方法 。
快速浏览一下 , 这里有一份来自 RFC 的属性示例:
【PHP 8 中新特性以及重大调整】use AppAttributesExampleAttribute;
<<ExampleAttribute>>
class Foo
{
<<ExampleAttribute>>
public const FOO = 'foo';
 
<<ExampleAttribute>>
public $x;
 
<<ExampleAttribute>>
public function foo(<<ExampleAttribute>> $bar) { }
}
<<PhpAttribute>>
class ExampleAttribute
{
public $value;
 
public function __construct($value)
{
$this->value = https://www.isolves.com/it/cxkf/yy/php/2020-07-06/$value;
}
}
如果您想深入了解属性如何工作以及如何构建自己的属性 , 您可以在此博客上阅读有关深入属性的信息 。
新增 static 返回类型尽管已经可以返回 self , 但是 static 直到 PHP 8 才是有效的返回类型。考虑到 PHP 具有动态类型的性质 , 此功能对于许多开发人员将非常有用 。
class Foo
{
public function test(): static
{
return new static();
}
}
新增 mixed 类型有人可能将其称为必要的邪恶:mixed 类型让许多人感觉十分混乱 。然而 , 有一个很好的论据支持去实现它:缺少类型在 PHP 中会导致很多情况:

  • 函数不返回任何内容或返回空值
  • 我们需要多种类型的一种类型
  • 我们需要的是PHP中不能进行类型提示的类型
因为上述原因 , 添加 mixed 类型是一件很棒的事儿 。mixed 本身代表下列类型中的任一类型:
  • array
  • bool
  • callable
  • int
  • float
  • null
  • object
  • resource
  • string
请注意 , mixed 不仅仅可以用来作为返回类型 , 还可以用作参数和属性类型 。
另外 , 还需要注意 , 因为 mixed 类型已经包括了 null , 因此 mixed 类型不可为空 。下面的代码会触发致命错误:
// 致命错误:混合类型不能为空 , null已经是混合类型的一部分 。
function bar(): ?mixed {}
throw 表达式该RFC将throw从一个语句更改为一个表达式 , 这使得可以在很多新地方抛出异常:
$triggerError = fn () => throw new MyError();
$foo = $bar['offset'] ?? throw new OffsetDoesNotExist('offset');
弱映射基于在 PHP 7.4 中新增的 弱引用 RFC , PHP 8 中新增了 WeakMaps(弱映射)的实现 。WeakMaps(弱映射)在保持对一些对象的引用的同时 , 并不会组织这些对象被垃圾回收机制处理。


推荐阅读