目录

  • 一、前言
  • 二、PHP 8.1 新特性
    • 纯交叉类型 Pure Intersection Types
    • 枚举 Enums
    • `never` 返回类型
    • Fibers 纤程
    • readonly 只读属性
  • 三、总结

一、前言

PHP 8.1 发布于2021 年 11 月 25 日,最近一次更新在2022 年 9 月 29 日,我们这次介绍一下这个版本的新特性。

如果你的项目正在使用 8.1 版本,请你要注意这些并且加以运用。

二、PHP 8.1 新特性

纯交叉类型 Pure Intersection Types

PHP 8.1 增加了对交叉类型的支持。 它类似于 PHP 8.0 中引入的联合类型,但它们的用途恰恰相反。

为了更好地理解它的用法,我们看下 PHP 中类型声明的工作原理。

你可以将类型声明添加到函数参数、返回值和类属性。 此分配称为类型提示,并确保该值在调用时具有正确的类型。 否则,它会立即抛出 TypeError。

但是,声明单一类型有局限性。 联合类型允许声明具有多种类型的值,并且输入必须满足至少一种声明的类型。

请注意使用 & (AND) 运算符来声明交叉类型。 相比之下,我们使用 | (OR) 运算符来声明联合类型。

在交集类型中使用大多数标准类型将导致永远无法实现的类型(例如整数和字符串)。 因此,交叉类型只能包括类类型(即接口和类名)。

下面是如何使用交叉类型的示例代码:

class PureIntersectionTypesClass {private Traversable&Countable $countableIterator;public function setIterator(Traversable&Countable $countableIterator): void {$this->countableIterator = $countableIterator;}public function getIterator(): Traversable&Countable {return $this->countableIterator;}
}

在上面的代码中,我们定义了一个变量 countableIterator 作为两种类型的交集:Traversable 和 Countable。 在这种情况下,声明的两种类型都是接口。

交叉类型也符合已经用于类型检查和继承的标准 PHP 变化规则。 但是还有两个额外的规则来说明交叉类型如何与子类型交互。

PHP 8.1 不能在同一个声明中组合联合类型和交叉类型。 因此,它的实现被称为“纯”交叉类型。

枚举 Enums

编程语言中最常见的枚举示例是布尔类型,其中 true 和 false 作为两能的值。

enum Suit {case Hearts;case Diamonds;case Clubs;case Spades;
}

在这里,Suit 枚举定义了四个可能的值:Hearts、Diamonds、Clubs 和 Spades。 您可以使用以下语法直接访问这些值:Suit::Hearts、Suit::Diamonds、Suit::Clubs 和 Suit::Spades。

枚举是在类和对象之上构建的。 枚举与类、接口和特征共享相同的命名空间。

上面提到的枚举称为纯枚举。

如果您想为任何情况提供标量等效值,您还可以定义支持的枚举。 但是,支持的枚举只能具有一种类型,即 int 或 string(从不同时具有两种类型)。

enum Suit: string {case Hearts = 'H';case Diamonds = 'D';case Clubs = 'C';case Spades = 'S';
}

注意,支持枚举的所有不同情况都必须具有唯一值。

never 返回类型

PHP 8.1 添加了一个名为 never 的新返回类型提示。 在总是抛出或退出的函数中使用它非常有帮助。

function redirect(string $uri): never {header('Location: ' . $uri);exit();
}function redirectToLoginPage(): never {redirect('/login');
}

never 返回类型的函数应满足三个条件:

  • 不应该明确定义 return 语句。
  • 不应该隐式定义 return 语句(例如 if-else 语句)。
  • 必须以退出语句(显式或隐式)结束其执行。

never返回类型与 void 返回类型有许多相似之处。 它们都确保函数或方法不返回值。 但是,它通过执行更严格的规则而有所不同。 例如,一个 void 声明的函数仍然可以在没有显式值的情况下返回,但你不能对一个never返回类型的函数做同样的事情。

Fibers 纤程

从历史上看,PHP 代码几乎总是同步代码。 代码执行会暂停,直到返回结果,即使对于 I/O 操作也是如此。 您可以想象为什么这个过程可能会使代码执行速度变慢。

Fiber 是 PHP 通过虚拟线程(或绿色线程)处理并行性的方式。 它试图通过允许 PHP 函数中断而不影响整个调用堆栈来消除同步和异步代码之间的差异。

我们可以使用 Fibers 开发全栈、可中断的 PHP 函数,然后可以使用这些函数在 PHP 中实现协作式多任务处理。

$fiber = new Fiber(function (): void {$value = Fiber::suspend('fiber');echo "Value used to resume fiber: ", $value, "\n";
});$value = $fiber->start(); //启动echo "Value from fiber suspending: ", $value, "\n";$fiber->resume('test'); //恢复

上面的示例输出如下。

Value from fiber suspending: fiber
Value used to resume fiber: test

readonly 只读属性

PHP 8.1 增加了对只读属性的支持。 它们只能从声明它们的范围初始化一次。 初始化后,您将无法修改它们的值。 这样做会引发错误异常。

class Test {public readonly string $kinsta;public function __construct(string $kinsta) {// 初始化$this->kinsta = $kinsta;}
}

readonly 属性在类内部和外部都提供了强大的不变性保证。

三、总结

PHP 8.1 的新特性很多,我们可以把重点放在

  • 枚举
  • never类型
  • 交叉类型
  • 只读属性

【PHP】PHP 8.1 的新特性一览 | 交叉类型、枚举、never 返回类型、Fibers 纤程、readonly 只读属性相关推荐

  1. 深入解析 | Oracle Database 20c 十大新特性一览

    在2020年2月14日,Oracle 正式宣布在 Oracle Cloud 发布 Database 20c 的预览版,同时发布了所有的官方文档. 为了和大家及时分享关于 Oracle 20c 引人瞩目 ...

  2. Java8-19新特性一览 ,认识全新的前沿技术

    文章目录 Java8-19新特性一览 ,认识全新的前沿技术 前言 你的收获 Java发展趋势 准备工作 新特性 1.接口private 1).说明 2).案例 3).注意 2.类型推断 1).说明 2 ...

  3. Java SE7新特性之泛型实例创建时的类型推断

    Java SE7新特性之泛型实例创建时的类型推断 标签: JDK7泛型 2014-01-04 15:34 6015人阅读 评论(0) 收藏 举报  分类: Java基础(9)  只要编译器从上下文中能 ...

  4. 【机器学习】scikit-learn 1.0 版本重要新特性一览

    1 简介 就在几天前,著名的机器学习框架scikit-learn在pypi上释放了其1.0rc1版本,这里给大家科普一下,版本号中的rc是Release Candidate的简称,代表当前的版本是一个 ...

  5. Oracle Database 20c 十大新特性一览

    从大会的分享和公布的资料中,我们整理了其中重要的新特性,汇聚成10个方向,按照惯例,和大家分享. 历史回顾: Oracle Database 20c 新特性: 1.原生的区块链支持 - Native ...

  6. JDK 13 新特性一览

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 作者:木九天 my.oschina.net/mdxlcj/blog ...

  7. Spring Framework 5.2 正式发布,14项新特性一览

    点击蓝色"程序猿DD"关注我 回复"资源"获取独家整理的学习资料! 作者 | xplanet 来源 | http://oschina.net/news/1103 ...

  8. Java 11将于本月25日发布,新特性一览

    作者:漫画编程 来源:漫画编程 2017年8月,JCP执行委员会提出将Java的发布频率改为每六个月一次.该决定将在Java 9正式发布之后开始实行. 2018年3月,Java 10如期而至.目前已经 ...

  9. oracle 峰度 函数,Oracle Database 21c 十大新特性一览

    摘要:Oracle 考虑到 2020 年我们的客户将面临前所未有的经济和业务中断.我们决定不将 Database 20c Preview 版本升级为 General Availability. 相反, ...

最新文章

  1. MyEclipse-Web开发时何时重启tomcat、重新部署
  2. c语言归并排序代码详细注释,C语言实现排序算法之归并排序详解
  3. pycharm 如何使用git链接到github实现代码提交
  4. VTK:PolyData之ConvexHull
  5. DFS应用——寻找欧拉回路
  6. ehcache 加载自定义配置文件ehcache.xml路径
  7. UnityShader9.1:光照基础实例
  8. pandas 字符串切片后保存_Pandas时间序列基础详解(转换,索引,切片)
  9. 【语音处理】基于matlab GUI数字音频分析与处理系统【含Matlab源码 1739期】
  10. 文本聚类kmeans
  11. linux生成密钥公钥,linux 生成密钥和公钥,实现免密登录
  12. 拼多多商家后台开放平台API
  13. PCI/PCIe转串口Linux驱动使用说明
  14. Mina MEID/GSM Activator 1.0 三网信号激活,支持12.5.3~14.7
  15. js前端导出Excel(可自定义文件名称,后缀,有边框样式)
  16. Simulink模块字体设置
  17. [Python]网络爬虫(六) 一个刷投票小脚本
  18. JS之使用Echarts画出人际关系图
  19. 苹果发布全新旗舰,对国内手机市场将造成什么影响?
  20. Android开发之自定义View之音阶图谱

热门文章

  1. 解决word表格中单元格自动计算的问题
  2. 单女最容易邂逅好男人的10个地方
  3. vue2.0---目录结构
  4. Win11如何设置用户权限?Win11设置用户权限的方法
  5. 超频到3200最佳时序_全网性价比最高:威刚龙耀D50新品内存,为超频而生
  6. 144:vue+openlayers 画多边形,任意编辑,并做遮罩剪切处理
  7. 悄悄地,VR「起死回生」
  8. ubuntu安装java依赖,在Ubuntu 16上安装R语言 - 未满足的依赖项
  9. c++ opencv函数putText用法详解
  10. sqluldr2 完美导出 ORACLE上亿条数据