PHP 8预计将于 2020 年 12 月 3 日发布,来说说P

2020-12-17  本文已影响0人  酷娃利息对比计算

   IT.互联网   技术   PHP

原文链接:http://www.msedt.com/infoflow/details/1058

面试一点通

PHP 8,PHP 的一个新的大版本,预计将于 2020 年 12 月 3 日发布,这意味着将不会有 PHP 7.5 版本。PHP8 目前正处于非常活跃的开发阶段,所以在接下来的几个月里,情况可能会发生很大的变化。

在这篇文章中,我会维持一个最新的清单列表,列出预计会出现的新特性、性能提升和突破性的变化。由于 PHP 8 是一个新的大版本,因此您的代码被破坏的可能性更高。如果您始终保持运行 PHP 的最新版本,那么升级相对来说就会轻松很多,因为在 7. * 版本中,大多数重大更改均已弃用。

除重大更改外,PHP 8 还带来了一些不错的新功能,比如说 JIT 编译器 , 联合类型 , 属性,以及更多。

新特性

从新特性开始,请记住 PHP8 仍处于活动开发阶段,因此此列表将随着时间的推移而增长。

联合类型 rfc

考虑到 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;复制代码

JIT rfc

JIT — just in time — 编译器虽然不总是在 Web 请求的上下文中,但是有望显着地提高性能。目前还没有完成任何准确的基准测试,但是肯定会到来。

如果您想进一步了解 JIT 对 PHP 的作用,可以阅读我写过的另一篇文章此处。

属性 rfc

属性在其他语言中通常被称为 注解 ,提供一种在无需解析文档块的情况下将元数据添加到类中的方法。

快速浏览一下,这里有一份来自 RFC 的属性示例:

use App\Attributes\ExampleAttribute;<>class Foo{    <>    public const FOO = 'foo';    <>    public $x;    <>    public function foo(<> $bar) { }}<>class ExampleAttribute{    public $value;    public function __construct($value)    {        $this->value = $value;    }}复制代码

如果您想深入了解属性如何工作以及如何构建自己的属性,您可以在此博客上阅读有关深入属性的信息。

新增static返回类型 rfc

尽管已经可以返回self,但是static直到 PHP 8 才是有效的返回类型 。考虑到 PHP 具有动态类型的性质,此功能对于许多开发人员将非常有用。

class Foo{    public function test(): static    {        return new static();    }}复制代码

新增mixed类型 rfc

有人可能将其称为必要的邪恶:mixed类型让许多人感觉十分混乱。然而,有一个很好的论据支持去实现它:缺少类型在 PHP 中会导致很多情况:

函数不返回任何内容或返回空值

我们需要多种类型的一种类型

我们需要的是 PHP 中不能进行类型提示的类型

因为上述原因,添加mixed类型是一件很棒的事儿。mixed本身代表下列类型中的任一类型:

array

bool

callable

int

float

null

object

resource

string

请注意,mixed不仅仅可以用来作为返回类型,还可以用作参数和属性类型。

另外,还需要注意,因为mixed类型已经包括了null,因此mixed类型不可为空。下面的代码会触发致命错误:

// 致命错误:混合类型不能为空,null已经是混合类型的一部分。function bar(): ?mixed {}复制代码

throw表达式 rfc

该 RFC 将throw从一个语句更改为一个表达式,这使得可以在很多新地方抛出异常:

$triggerError = fn () => throw new MyError();$foo = $bar['offset'] ?? throw new OffsetDoesNotExist('offset');复制代码

弱映射 rfc

基于在 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 rfc

一个很小但是很有用的新特性:现在可以在对象上使用:: class,而不必在对象上使用get_class(),它的工作方式跟get_class()相同。

$foo = new Foo();var_dump($foo::class);复制代码

Non-capturing catches rfc

在 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 作为捕获类型。

参数列表中的尾部逗号 rfc

当调用函数时已经支持尾部逗号,但是参数列表中仍然缺少尾随逗号支持。现在 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);复制代码

新增Stringable接口 rfc

Stringable接口可用于键入提示任何字符串或实现__ toString()的内容。此外,每当一个类实现__ toString()时,它就会自动实现后台接口,而无需手动实现。

class Foo{    public function __toString(): string    {        return 'foo';    }}function bar(Stringable $stringable) { /* … */ }bar(new Foo());bar('abc');复制代码

新增str_contains()函数 rfc

有些人可能会说这是早该发生的,但我们最终不必再依赖 strpos 来知道一个字符串是否包含另一个字符串。

无需这样做:

if (strpos('string with lots of words', 'words') !== false) { /* … */ }复制代码

你可以这样做:

if (str_contains('string with lots of words', 'words')) { /* … */ }复制代码

新增str_starts_with()和str_ends_with()函数 rfc

这是另外两个早该出现的函数,现在已在核心函数中添加了这两个函数。

str_starts_with('haystack', 'hay'); // truestr_ends_with('haystack', 'stack'); // true复制代码

点关注,不迷路

好了各位,以上就是这篇文章的全部内容了,能看到这里的人呀,都是人才。

上一篇下一篇

猜你喜欢

热点阅读