加入收藏 | 设为首页 | 会员中心 | 我要投稿 阳江站长网 (https://www.0662zz.cn/)- 办公协同、云通信、区块链、物联平台、高性能计算!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

PHP8.2将有哪些改动

发布时间:2022-08-10 11:14:40 所属栏目:PHP教程 来源:互联网
导读:目前PHP8.2的发布时间还没有确定,但是预计将在2022年末发布。这篇文章将为你介绍在新版本中的功能、性能改进、弃用的特性等。 相关推荐:PHP8.2最新进展,即将进行新特性冻结! null和false将作为独立的类型 PHP并不会陷入到完美的类型安全方向中,但是从技
  目前PHP8.2的发布时间还没有确定,但是预计将在2022年末发布。这篇文章将为你介绍在新版本中的功能、性能改进、弃用的特性等。
  相关推荐:PHP8.2最新进展,即将进行新特性冻结!
 
  null和false将作为独立的类型
 
  PHP并不会陷入到完美的类型安全方向中,但是从技术的角度考虑,将null和false作为独立的数据类型是值得的。一般情况下,PHP的很多常见的函数,会通过返回false表示出错了。比如在file_get_content中:
 
 
  file_get_contents(/* … */): string|false
 
  在以前,false可以在联合类型中使用,但是不能独立使用,在PHP8.2中可以单独使用:
  
 
  function alwaysFalse(): false
 
  {
 
      return false;
 
  }
 
  当然,对于这个做法,一些开发者都持谨慎态度。他并不支持true作为独立类型。这些开发者们认为,false只是一个值,类型应该代表类别而不是一个值。当然在类型系统中,有一个概念是单元类型,它是只允许一个值的类型。但是这真的有用吗?
 
  不过另一个RFC也正在讨论将true作为一种类型添加到PHP中。
 
  一个独立的null却很有意义,这样可以简单地实现空对象模式:
 
  
  class Post
 
  {
 
      public function getAuthor(): ?string { /* … */ }
 
  }
 
   
 
  class NullPost extends Post
 
  {
 
      public function getAuthor(): null { /* … */ }
 
  }
 
  这对NullPost::getAuthor()能够说它只会返回null,不必像以前那样必须将null和string一起联合声明。
 
  弃用动态属性
 
  对于语言规范来说,这是更好的设计,但是也会限制很多用法。动态属性在PHP8.2中被弃用,并且会在PHP中抛出错误异常。
 
  什么是动态属性?就是你没有在类中声明这些属性,但是仍然可以设置和获取:
  
 
  class Post
 
  {
 
      public string $title;
 
  }
 
   
 
  // …
 
   
 
  $post->name = 'Name';  // 在PHP8.2中不能这样使用,因为并没有在类中声明
 
  不过放心,__set和__get等魔术方法将仍然按预期中工作:
  
 
  class Post
 
  {
 
      private array $properties = [];
 
   
 
      public function __set(string $name, mixed $value): void
 
      {
 
          $this->properties[$name] = $value;
 
      }
 
  }
 
   
 
  // …
 
   
 
  $post->name = 'Name';
 
  标准对象也是如此:stdClass将继续支持动态属性。
 
  PHP曾经是一种动态程度很强的动态语言,但是现在已经有很多人愿意接受更加严格的编程方式了。尽可能的严格,尽可能的依赖静态分析是一件好事,这能让开发者们写出更好的代码。
 
  不过可能一部分很看重动态属性的开发人员对这种变化会很不满意,如果你不想在使用PHP8.2时看到这些警告,可以这样做:
 
  可以使用#[AllowDynamicProperties]
  
 
  #[AllowDynamicProperties]
 
  class Post
 
  {
 
      public string $title;
 
  }
 
   
 
  // …
 
   
 
  $post->name = 'Name'; // 一切正常
 
  另一种方法是修改报警级别,但不建议这样做。等你打算升级到PHP9.0时会遇到麻烦。
 
 
  error_reporting(E_ALL ^ E_DEPRECATED);
 
  追踪调用时参数脱敏
 
  什么叫参数脱敏?在我们开发时,遇到错误,都会使用Trace调试,但是目前的堆栈记录下一些敏感数据,比如环境变量、密码、用户。

(编辑:阳江站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读