最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • PHP 8发布啦!来说说PHP 8 的新特性

    正文概述 转载于:掘金(阿布阿布)   2020-12-11   428

    在这篇文章中,我会维持一个最新的清单列表,列出预计会出现的新特性、性能提升和突破性的变化。由于 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;
    
    <<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 8发布啦!来说说PHP 8 的新特性

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

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

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

    asfsfasf

    起源地下载网 » PHP 8发布啦!来说说PHP 8 的新特性

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元