PHP 8新特性简介


Posted in PHP onAugust 18, 2020

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

以上就是PHP 8新特性简介的详细内容,更多关于php 8新特性的资料请关注三水点靠木其它相关文章!

PHP 相关文章推荐
一个用于mysql的数据库抽象层函数库
Oct 09 PHP
php增删改查示例自己写的demo
Sep 04 PHP
php 模拟post_验证页面的返回状态(实例讲解)
Oct 28 PHP
php过滤HTML标签、属性等正则表达式汇总
Sep 22 PHP
试用php中oci8扩展
Jun 18 PHP
基于thinkPHP实现的微信自定义分享功能示例
Sep 23 PHP
Yii2-GridView 中让关联字段带搜索和排序功能示例
Jan 21 PHP
php获取文章内容第一张图片的方法示例
Jul 03 PHP
PHP实现批量重命名某个文件夹下所有文件的方法
Sep 04 PHP
php读取本地json文件的实例
Mar 07 PHP
laravel 解决多库下的DB::transaction()事务失效问题
Oct 21 PHP
PHP7新增函数
Mar 09 PHP
PHP大文件及断点续传下载实现代码
Aug 18 #PHP
基于thinkphp5框架实现微信小程序支付 退款 订单查询 退款查询操作
Aug 17 #PHP
PhpStorm2020.1 安装 debug - Postman 调用的详细教程
Aug 17 #PHP
php开发最强大的IDE编辑的phpstorm 2020.2配置Xdebug调试的详细教程
Aug 17 #PHP
PHP unset函数原理及使用方法解析
Aug 14 #PHP
PHP常量及变量区别原理详解
Aug 14 #PHP
PHP获取当前时间不准确问题解决方案
Aug 14 #PHP
You might like
php获取后台Job管理的实现代码
2011/06/10 PHP
php 文本文件的读取效率
2012/02/10 PHP
PHP __autoload()方法真的影响性能吗?
2012/03/30 PHP
基于PHP服务端图片生成缩略图的方法详解
2013/06/20 PHP
php获取qq用户昵称和在线状态(实例分析)
2013/10/27 PHP
php正则表达式获取内容所有链接
2015/07/24 PHP
PHP实现抓取迅雷VIP账号的方法
2015/07/30 PHP
PHP处理数组和XML之间的互相转换
2016/06/02 PHP
Yii框架where查询用法实例分析
2019/10/22 PHP
DHTML 中的绝对定位
2006/11/26 Javascript
JavaScript 密码强度判断代码
2009/09/05 Javascript
js实现屏蔽默认快捷键调用自定义事件示例
2013/06/18 Javascript
javascript中的previousSibling和nextSibling的正确用法
2015/09/16 Javascript
jQuery实现的选择商品飞入文本框动画效果完整实例
2016/08/10 Javascript
jquery利用json实现页面之间传值的实例解析
2016/12/12 Javascript
使用vue.js2.0 + ElementUI开发后台管理系统详细教程(一)
2017/01/21 Javascript
Node连接mysql数据库方法介绍
2017/02/07 Javascript
解析Vue2.0双向绑定实现原理
2017/02/23 Javascript
详解Vue.js搭建路由报错 router.map is not a function
2017/06/27 Javascript
详解如何用VUE写一个多用模态框组件模版
2018/09/27 Javascript
JS实现的图片选择顺序切换和循环切换功能示例【测试可用】
2018/12/28 Javascript
Vue快速实现通用表单验证功能
2019/12/05 Javascript
JQuery插件tablesorter表格排序实现过程解析
2020/05/28 jQuery
如何在vue中使用jointjs过程解析
2020/05/29 Javascript
[53:21]2014 DOTA2国际邀请赛中国区预选赛5.21 DT VS LGD-CDEC
2014/05/22 DOTA
基于Python3 逗号代码 和 字符图网格(详谈)
2017/06/22 Python
解决使用PyCharm时无法启动控制台的问题
2019/01/19 Python
Flask框架中request、请求钩子、上下文用法分析
2019/07/23 Python
如何利用python给图片添加半透明水印
2019/09/06 Python
pyinstaller打包程序exe踩过的坑
2019/11/19 Python
Python导入父文件夹中模块并读取当前文件夹内的资源
2020/11/19 Python
HTML5 Canvas入门学习教程
2016/03/17 HTML / CSS
韩国江南富人区高端时尚百货商场:Galleria(格乐丽雅)
2018/03/27 全球购物
教师遵守党的政治纪律情况对照检查材料
2014/09/26 职场文书
简历自我评价范文
2019/04/24 职场文书
springboot @ConfigurationProperties和@PropertySource的区别
2021/06/11 Java/Android