PHP 8发布啦!来讲说PHP 8 的新特性

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

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

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

新特性

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

联合类型 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;

<<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 返回类型 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() 如今有一种通用的方法能够将 DateTimeDatetimeImmutable 对象相互转换。

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'); // true
str_ends_with('haystack', 'stack'); // true

点关注,不迷路

好了各位,以上就是这篇文章的所有内容了,能看到这里的人呀,都是人才。以前说过,PHP方面的技术点不少,也是由于太多了,实在是写不过来,写过来了你们也不会看的太多,因此我这里把它整理成了PDF和文档,若是有须要的能够

点击进入暗号: PHP+「平台」

在这里插入图片描述

在这里插入图片描述


更多学习内容能够访问【对标大厂】精品PHP架构师教程目录大全,只要你能看完保证薪资上升一个台阶(持续更新)

以上内容但愿帮助到你们,不少PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提高,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货须要的能够免费分享给你们,须要的能够加入个人 PHP技术交流群

相关文章
相关标签/搜索