在这篇文章中,我会坚持一个最新的清单列表,列出估量会涌现的新特性、性能提升和打破性的变革。由于 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 的属性示例:
use App\Attributes\ExampleAttribute;
<<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 = $value;
}
}
如果您想深入理解属性如何事情以及如何构建自己的属性,您可以在此博客上阅读有关深入属性的信息。
新增 static 返回类型只管已经可以返回 self,但是 static 直到 PHP 8 才是有效的返回类型 。考虑到 PHP 具有动态类型的性子,此功能对付许多开拓职员将非常有用。
class Foo
{
public function test(): static
{
return new static();
}
}
新增 mixed 类型有人可能将其称为必要的邪恶:mixed 类型让许多人觉得十分混乱。然而,有一个很好的论据支持去实现它:短缺类型在 PHP 中会导致很多情形:
函数不返回任何内容或返回空值我们须要多种类型的一种类型我们须要的是PHP中不能进行类型提示的类型由于上述缘故原由,添加 mixed 类型是一件很棒的事儿。mixed 本身代表下列类型中的任一类型:
arrayboolcallableintfloatnullobjectresourcestring请把稳,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(弱映射)在保持对一些工具的引用的同时,并不会组织这些工具被垃圾回收机制处理 。
以ORM为例,它们常日实现保存对实体类的引用的缓存,从而提高实体类之间关联的性能。 只要缓存中存在对这些实体类的引用,那么这些类就无法被垃圾回收机制回收,只管除了缓存中,已经没有别处再引用这些实体类,它们依然不会被垃圾处理机制处理。
如果这个缓存层利用了弱引用和弱映射,那么 PHP 将会在这些实体类没有任何其他引用时,对其进行垃圾回收。 尤其是对付 ORMs,它可以管理一个要求中的数百个(如果不是数千个)实体;弱映射可以供应一种更好的、对资源更友好的办法来处理这些工具。
下面是弱映射基本的例子,摘抄自 RFC :
class Foo
{
private WeakMap $cache;
public function getSomethingWithCaching(object $obj): object
{
return $this->cache[$obj]
??= $this->computeSomethingExpensive($obj);
}
}
许可对工具利用 ::class一个很小但是很有用的新特性:现在可以在工具上利用 :: class ,而不必在工具上利用 get_class() ,它的事情办法跟 get_class() 相同。
$foo = new Foo();
var_dump($foo::class);
Non-capturing catches在PHP 8 之前,无论何时你想要捕获一个非常,你都须要先将其存储到一个变量中,不管这个变量你是否会用到。通过 Non-capturing catches 你可以忽略变量,以是更换下面的代码:
try {
// Something goes wrong
} catch (MySpecialException $exception) {
Log::error("Something went wrong");
}
你现在可以这么做:
try {
// Something goes wrong
} catch (MySpecialException) {
Log::error("Something went wrong");
}
请把稳,必须始终指定类型,不许可将 catch 留空,如果你想要捕获所有类型的非常和缺点,须要利用 Throwable 作为捕获类型。
参数列表中的尾部逗号当调用函数时已经支持尾部逗号,但是参数列表中仍旧短缺尾随逗号支持。现在PHP8中许可这样做,这意味着您可以实行以下操作:
public function(
string $parameterA,
int $parameterB,
Foo $objectfoo,
) {
// …
}
从接口创建DateTime 工具你已经可以利用 DateTime::createFromImmutable($immutableDateTime) 从 DateTimeImmutable 工具创建一个 DateTime 工具, 而另一种方法则更加取巧。通过添加DateTime::createFromInterface()和DatetimeImmutable::createFromInterface()现在有一种通用的方法可以将DateTime和DatetimeImmutable工具相互转换。
DateTime::createFromInterface(DateTimeInterface $other);
DateTimeImmutable::createFromInterface(DateTimeInterface $other);