PHP 8.0新功能和优化详解

      2021-3-18 10:08| 发布者: admin| 查看: 23| 评论: 0

      摘要: PHP于2020年11月27日发布了最新版本8.0,我们来谈谈PHP 8.0版本相较于PHP 7.0带来了哪些新功能和优化。一、命名参数对比PHP 7htmlspecialchars($string, ENT_COMPAT | ENT_HTML401, 'UTF-8', false);PHP 8htmlspecia ...
      PHP于2020年11月27日发布了最新版本8.0,我们来谈谈PHP 8.0版本相较于PHP 7.0带来了哪些新功能和优化。

      一、命名参数对比
      PHP 7
      htmlspecialchars($string, ENT_COMPAT | ENT_HTML401, 'UTF-8', false);

      PHP 8
      htmlspecialchars($string, double_encode: false);

      仅指定必需的参数,跳过可选的参数。
      参数是与顺序无关的且具有自记录功能。

      二、属性对比
      PHP 7
      class PostsController
      {
          /**
           * @Route("/api/posts/{id}", methods={"GET"})
           */
          public function get($id) { /* ... */ }
      }

      PHP 8
      class PostsController
      {
          #[Route("/api/posts/{id}", methods: ["GET"])]
          public function get($id) { /* ... */ }
      }
      现在,您可以使用具有PHP本机语法的结构化元数据来代替PHPDoc批注。

      三、构造函数属性提升对比
      PHP 7
      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;
        }
      }

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

      更少的样板代码来定义和初始化属性。

      四、联合类型对比
      PHP 7
      class Number {
        /** @var int|float */
        private $number;

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

      new Number('NaN'); // Ok

      PHP 8
      class Number {
        public function __construct(
          private int|float $number
        ) {}
      }

      new Number('NaN'); // TypeError

      可以使用在运行时验证的本机联合类型声明来代替类型组合的PHPDoc批注。

      五、匹配表达式对比
      PHP 7
      switch (8.0) {
        case '8.0':
          $result = "Oh no!";
          break;
        case 8.0:
          $result = "This is what I expected";
          break;
      }
      echo $result;
      //> Oh no!

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

      新的匹配项类似于switch,并具有以下功能:

      Match是一个表达式,表示其结果可以存储在变量中或返回。
      Match分支仅支持单行表达式,不需要中断。陈述。
      匹配进行严格的比较。

      六、空安全运算符对比
      PHP 7
      $country =  null;

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

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

      PHP 8
      $country = $session?->user?->getAddress()?->country;

      现在,您可以使用带有新的nullsafe运算符的调用链来代替空检查条件。当对链中一个元素的求值失败时,整个链的执行将中止,并且整个链的求值为空。

      七、Saner字符串与数字的比较
      PHP 7
      0 == 'foobar' // true

      PHP 8
      0 == 'foobar' // false

      与数字字符串进行比较时,PHP 8使用数字比较。否则,它将数字转换为字符串并使用字符串比较。

      八、内部函数的类型一致错误
      PHP 7
      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

      PHP 8
      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

      现在,如果参数验证失败,则大多数内部函数将引发Error异常。

      九、及时编译对比
      PHP 8引入了两个JIT编译引擎。跟踪JIT是两者中最有前途的,在综合基准测试中,其性能提高了约3倍,在某些特定的长期运行的应用程序中,其性能提高了1.5–2倍。典型的应用程序性能与PHP 7.4相当。

      JIT对PHP 8性能的相对贡献

      十、类型系统和错误处理方面的改进
      对算术/按位运算符RFC进行更严格的类型检查
      抽象特征方法验证RFC
      魔术方法RFC的正确签名
      重新分类引擎警告RFC
      不兼容的方法签名RFC的致命错误
      @运算符不再使致命错误失效。
      使用私有方法RFC的继承
      混合类型RFC
      静态返回类型RFC
      内部功能的类型 电子邮件线程
      不透明的对象,而不是 Curl, Gd, Sockets, OpenSSL, XMLWriter和 XML 扩展的资源

      十一、其他语法调整和改进
      在参数列表RFC 和闭包使用列表RFC中允许结尾逗号
      非捕获捕获RFC
      可变语法调整RFC
      将命名空间名称视为单个令牌RFC
      Throw现在是RFC表达式
      在对象RFC上允许:: class

      十二、新的类,接口和功能
      弱地图类
      可串接的介面
      str_contains(), str_starts_with(), str_ends_with()
      fdiv()
      get_debug_type()
      get_resource_id()
      token_get_all()对象的实现
      新的DOM遍历和操纵API

      鲜花

      握手

      雷人

      路过

      鸡蛋

      相关阅读

      QQ|Archiver|手机版|小黑屋|蓄财网 ( 豫ICP备2021002293号 )

      GMT+8, 2021-9-14 12:02 , Processed in 0.091415 second(s), 31 queries .

      蓄财网 ©版权所有

      © 2021 蓄财网(www.aixc.cn)

      返回顶部