PHP 8有什么新特性

PHP 8新特性

新的主要PHP版本PHP 8预计将于2020年底发布。它现在处于非常活跃的开发阶段,所以在接下来的几个月里,事情可能会发生很大的变化。

在这篇文章中,我将持续更新预期的内容列表:新特性、性能改进和重大变化。因为PHP 8是一个新的主版本,所以您的代码被破坏的几率更高。如果你一直在更新最新的版本,升级应该不会太困难,因为大多数有破坏性的更改在7之前就已经废弃了。*版本。

除了中断更改之外,PHP 8还带来了一些不错的新特性,比如JIT编译器和union类型;还有更多!

Union types:联合类型

考虑到PHP的动态类型化特性,在很多情况下联合类型是有用的。联合类型是两个或多个类型的集合,这些类型表示其中一个可以使用。

public function foo(Foo|Bar $input): int|float;

注意,void永远不能是union类型的一部分,因为它表示“根本没有返回值”。此外,可以使用|null来编写可为空的联合,也可以使用现有的?符号:

public function foo(Foo|null $foo): void;

public function bar(?Bar $bar): void;

JIT

即时编译器承诺显著的性能改进,尽管并不总是在web请求的上下文中。目前还没有任何准确的基准,但它们肯定会到来。

Static return type:静态的返回类型

虽然已经可以返回self,但静态类型直到PHP 8才成为有效的返回类型。考虑到PHP的动态类型特性,这一特性对许多开发人员都很有用。

class Foo
{
  public function test(): static
  {
    return new static();
  }
}

Weak maps

在PHP 7.4中添加的weakrefs RFC的基础上,在PHP 8中添加了WeakMap实现。弱映射包含对对象的引用,这并不会阻止那些对象被垃圾收集。

以orm为例,它们通常实现保存对实体类的引用的缓存,以改进实体之间关系的性能。这些实体对象不能被垃圾回收,只要这个缓存有一个对它们的引用,即使缓存是唯一引用它们的东西。

如果这个缓存层使用弱引用和映射,那么PHP将在没有其他对象引用它们时对这些对象进行垃圾收集。尤其是orm,它可以在一个请求中管理数百个(如果不是数千个)实体;弱映射为处理这些对象提供了一种更好的、对资源更友好的方法。

下面是弱映射的样子,一个来自RFC的例子:

class Foo 
{
  private WeakMap $cache;

  public function getSomethingWithCaching(object $obj): object
  {
    return $this->cache[$obj]
      ??= $this->computeSomethingExpensive($obj);
  }
}

::class on objects

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

$foo = new Foo();

var_dump($foo::class);

Stringable interface

Stringable接口可用于键入提示任何字符串或实现了 tostring()的内容。而且,无论何时类实现了 tostring(),它都会在后台自动实现接口,不需要手动实现。

class Foo
{
  public function __toString(): string
  {
    return 'foo';
  }
}

function bar(Stringable $stringable) { /* … */ }

bar(new Foo());
bar('abc');

从接口创建DateTime对象

您已经可以使用DateTime:: createfromimmutabledatetime ($immutableDateTime)从一个datetime对象创建一个DateTime对象,但是另一种方法比较麻烦。通过添加DateTime::createFromInterface()和datetime::createFromInterface(),现在就有了一种将DateTime和datetime对象相互转换的通用方法。

DateTime::createFromInterface(DateTimeInterface $other);

DateTimeImmutable::createFromInterface(DateTimeInterface $other);

重新定义引擎的警告

许多以前只触发警告或通知的错误现在已经转换为正确的错误。以下警告已更改。

  • Undefined variable: Error exception instead of notice

  • Undefined array index: warning instead of notice

  • Division by zero: DivisionByZeroError exception instead of warning

  • Attempt to increment/decrement property ‘%s' of non-object: Error exception instead of warning

  • Attempt to modify property ‘%s' of non-object: Error exception instead of warning

  • Attempt to assign property ‘%s' of non-object: Error exception instead of warning

  • Creating default object from empty value: Error exception instead of warning

  • Trying to get property ‘%s' of non-object: warning instead of notice

  • Undefined property: %s::$%s: warning instead of notice

  • Cannot add element to the array as the next element is already occupied: Error exception instead of warning

  • Cannot unset offset in a non-array variable: Error exception instead of warning

  • Cannot use a scalar value as an array: Error exception instead of warning

  • Only arrays and Traversables can be unpacked: TypeError exception instead of warning

  • Invalid argument supplied for foreach(): TypeError exception instead of warning

  • Illegal offset type: TypeError exception instead of warning

  • Illegal offset type in isset or empty: TypeError exception instead of warning

  • Illegal offset type in unset: TypeError exception instead of warning

  • Array to string conversion: warning instead of notice

  • Resource ID#%d used as offset, casting to integer (%d): warning instead of notice

  • String offset cast occurred: warning instead of notice

  • Uninitialized string offset: %d: warning instead of notice

  • Cannot assign an empty string to a string offset: Error exception instead of warning

原创文章,作者:PTDYJ,如若转载,请注明出处:http://www.wangzhanshi.com/n/15283.html

(0)
PTDYJ的头像PTDYJ
上一篇 2025年1月2日 12:17:55
下一篇 2025年1月2日 12:17:59

相关推荐

  • 如何在macbook pro中安装php7

    macbook pro怎么安装php7? Mac安装PHP7: 经历了一个漫长的等待,在我们的PHP5.6发布后,我们最新的PHP7终于发布了(等等,我们的6到哪去了?),根据官方…

    php 2025年1月1日
  • php7和php5有什么区别

    1、php标量类型和返回类型声明 #主要分为两种模式,强制性模式和严格模式declare(strict_types=1)#1表示严格类型校验模式,作用于函数调用和返回语句;0表示弱…

    php 2025年1月1日
  • PHP7中如何使用太空船操作符

    太空船操作符 它的写法是这样的<=>。它结合了比较。它表示 “小于,等于或大于”。当使用用户定义的比价函数对数组进行排序时,它非常有用,因为返回值是: 0 如果值相等 …

    php 2025年1月1日
  • PHP如何优化冗余代码

    在编程中,代码的冗余是一个常见的问题,不仅增加了代码的复杂性,还降低了可读性和可维护性。对于PHP这样的语言来说,减少代码冗余同样重要,尤其是当项目规模变得越来越大时。本文将探讨如…

    php 2024年12月17日
  • php7中的空文件夹怎么利用递归进行删除

    代码如下: <?php $path = 'd:/'; rmDir_1($path); function rmDir_1($path) { $fi…

    php 2025年1月1日
  • 如何解决PHP无法实现多线程的问题

    其实的是大多数情况下,你大可不必使用fork或者线程,并且你会得到比用fork或thread更好的性能。假设你要建立一个服务来检查正在运行的n台服务器,以确定他们还在正常运转。你可…

    php 2025年1月2日
  • 如何使用yum命令安装php7和相关扩展

    php有什么用 php是一个嵌套的缩写名称,是英文超级文本预处理语言,它的语法混合了C、Java、Perl以及php自创新的语法,主要用来做网站开发,许多小型网站都用php开发,因…

    php 2025年1月1日
  • PHP实现文件下载限速功能的方法详解

    限速下载文件的原理是通过控制数据传输的速率来限制下载的速度。在PHP中,我们可以通过以下步骤来实现限速下载文件的功能: 设置下载响应头: 在发送文件内容之前,设置正确的HTTP响应…

    php 2024年12月17日
  • ThinkPHP中泛域名部署的实现方法

    如何在ThinkPHP中实现泛域名部署站群 对于需要部署多个网站的开发者来说,站群架构是一种广泛采用的设计模式。而泛域名部署则是站群架构中比较常见的实现方式之一。在这篇文章中,我们…

    php 2024年12月17日
  • PHP7 OpenSSL DES-EDE-CBC加解密的示例分析

    1、条件约束 之前PHP5上常使用的mcrypt库在PHP7.1+上已经被移除,故我们采用openssl对数据进行加解密。 加密方式采用DES-EDE-CBC方式。 密钥填充方式为…

    php 2025年1月1日

发表回复

登录后才能评论