全网最全的php8新特性

Posted autofelix

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了全网最全的php8新特性相关的知识,希望对你有一定的参考价值。

〝 古人学问遗无力,少壮功夫老始成 〞

php8出来也已经有一段时间了,但是真正使用到项目中的公司却还不多,虽然功能新增了很多,但是因为作为最新版本的php,是不可能直接应用到项目中的,只有经过真操实弹的项目检测,才会慢慢推广迭代,但是作为最新版本的php8,它的新特性我们还是必须要知了解的,常码字不易,出精品更难,没有特别幸运,那么请先特别努力,别因为懒惰而失败,还矫情地将原因归于自己倒霉。你必须特别努力,才能显得毫不费力。如果这篇文章能给你带来一点帮助,希望给飞兔小哥哥一键三连,表示支持,谢谢各位小伙伴们。

目录

一、 官方网站

二、命名参数

三、属性注解

四、构造器属性的提升

五、联合类型

六、match表达式

七、nullsafe运算符

八、字符串数字弱类型比较优化

九、函数错误一致性

十、JIT优化

十一、其他改进


一、 官方网站

二、命名参数

  • 官方英文:Named arguments
  • 传参的时候,可以跳过可选参数,这在之前版本中不行
<?php
//php7
htmlspecialchars($string, ENT_COMPAT | ENT_HTML401, 'UTF-8', false);

//php8
htmlspecialchars($string, double_encode: false);

三、属性注解

  • 官方英文:Attributes
  • 可以使用PHP原生语法来使用结构化元数据,而非PHPDoc申明
<?php
//php7
class PostsController
{
    /**
     * @Route("/api/posts/{id}", methods={"GET"})
     */
    public function get($id) { /* ... */ }
}

//php8
class PostsController
{
    #[Route("/api/posts/{id}", methods: ["GET"])]
    public function get($id) { /* ... */ }
}

四、构造器属性的提升

  • 官方英文:Constructor property promotion
  • 可以使用更简便的方法初始化属性
<?php
//php7
class Point {
  public float $x;
  public float $y;
  public float $z;

  public function __construct(
    float $x = 0.0,
    float $y = 0.0,
    float $z = 0.0
  ) {
    $this->x = $x;
    $this->y = $y;
    $this->z = $z;
  }
}

//php8
class Point {
  public function __construct(
    public float $x = 0.0,
    public float $y = 0.0,
    public float $z = 0.0,
  ) {}
}

五、联合类型

  • 官方英文:Union types
  • 老版本申明类型单一,php8可以申明多种类型
<?php
//php7
class Number {
  /** @var int|float */
  private $number;

  /**
   * @param float|int $number
   */
  public function __construct($number) {
    $this->number = $number;
  }
}

new Number('NaN'); // Ok

//php8
class Number {
  public function __construct(
    private int|float $number
  ) {}
}

new Number('NaN'); // TypeError

六、match表达式

  • 官方英文:Match expression
  • switch表达式的简化
<?php
//php7
switch (8.0) {
  case '8.0':
    $result = "Oh no!";
    break;
  case 8.0:
    $result = "This is what I expected";
    break;
}

//php8
echo match (8.0) {
  '8.0' => "Oh no!",
  8.0 => "This is what I expected",
};

七、nullsafe运算符

  • 官方英文:Nullsafe operator 
  • 可以使用nullsafe运算符链式调用,而不需要检测null,如果其中一个不满足,直接中断并返回null
<?php
//php7
$country =  null;

if ($session !== null) {
  $user = $session->user;

  if ($user !== null) {
    $address = $user->getAddress();
 
    if ($address !== null) {
      $country = $address->country;
    }
  }
}

//php8
$country = $session?->user?->getAddress()?->country;

八、字符串数字弱类型比较优化

  • 官方英文:Saner string to number comparisons
  • 字符串和数字的比较更加的严格
<?php
//php7
0 == 'foobar' // true

//php8
0 == 'foobar' // false

九、函数错误一致性

  • 官方英文:Consistent type errors for internal functions
  • 以前错误类型会分notice、warning、error,现在大多数位TypeError
<?php
//php7
strlen([]); // Warning: strlen() expects parameter 1 to be string, array given
array_chunk([], -1); // Warning: array_chunk(): Size parameter expected to be greater than 0

//php8 
strlen([]); // TypeError: strlen(): Argument #1 ($str) must be of type string, array given
array_chunk([], -1); // ValueError: array_chunk(): Argument #2 ($length) must be greater than 0

十、JIT优化

  • 官方英文:Relative JIT contribution to PHP 8 performance
  • 这个改动被鸟哥成为php8中最重要的改动,php8中引入了两个即时编译引擎,Tracing JIT在两个中潜力更大,显示了三倍的性能,某些长时间运行的程序中也显示了1.5-2倍的性能改进

十一、其他改进

  • 操作符@将不再抑制fatal类型错误
  • assert()不再支持执行代码,减少了安全漏洞
  • create_function()函数彻底被移除
  • 因为libxml的依赖最低2.9.0起,所以XXE漏洞彻底可以消失了
  • Phar中元信息不再进行自动反序列化了,phar://触发反序列化的姿势也告别了
  • parse_str()必须传入第二个参数了,少了一种全局变量覆盖的方法

以上是关于全网最全的php8新特性的主要内容,如果未能解决你的问题,请参考以下文章

全网最全 ECMAScript 攻略

PHP 8 新特性之 Attributes (注解)

从0开始手把手带你入门Vue3-全网最全(1.1w字)

一文看懂 PHP 8 的新特性

PHP 8 性能怎么样?

PHPPHP 8.1 的新特性一览 | 交叉类型枚举never 返回类型Fibers 纤程readonly 只读属性