写点什么

PHP 8.1 发布:新增枚举功能

  • 2021-11-26
  • 本文字数:3674 字

    阅读完需:约 12 分钟

PHP 8.1 发布:新增枚举功能

2021 年 11 月 25 日,PHP 开发团队宣布正式发布 PHP 8.1,PHP 8.1 标志着 PHP 语言迎来又一波重大更新。新版本涵盖枚举、只读属性、先进的可调用语法、纤程、交集类型以及性能改进等多项功能特性,其中引入枚举成最大亮点。

PHP 8.1 新特性

枚举


此前 PHP 版本


class Status{    const DRAFT = 'draft';    const PUBLISHED = 'published';    const ARCHIVED = 'archived';}function acceptStatus(string $status) {...}
复制代码


PHP 8.1


enum Status{    case Draft;    case Published;    case Archived;}function acceptStatus(Status $status) {...}
复制代码

只读属性


此前 PHP 版本


class BlogData{    private Status $status;      public function __construct(Status $status)    {        $this->status = $status;    }       public function getStatus(): Status    {        return $this->status;       }}
复制代码


PHP 8.1


class BlogData{    public readonly Status $status;      public function __construct(Status $status)    {        $this->status = $status;    }}
复制代码


只读属性无法在初始化后(即被赋值之后)更改。开发者可以使用只读属性对值对象及数据传输对象进行建模。

先进的可调用语法


此前 PHP 版本


$foo = [$this, 'foo'];
$fn = Closure::fromCallable('strlen');
复制代码


PHP 8.1


$foo = $this->foo(...);
$fn = strlen(...);
复制代码


现在,开发者可以引用任何函数——即先进的可调用语法。

初始化器更新


此前 PHP 版本


class Service{    private Logger $logger;
public function __construct( ?Logger $logger = null, ) { $this->logger = $logger ?? new NullLogger(); }}
复制代码


PHP 8.1


class Service{    private Logger $logger;       public function __construct(        Logger $logger = new NullLogger(),    ) {        $this->logger = $logger;    }}
复制代码


对象现可作为默认参数值、静态变量、全局常量以及属性参数使用。这项更改使得嵌套属性成为可能。


此前 PHP 版本


class User{    /**     * @Assert\All({     *     @Assert\NotNull,     *     @Assert\Length(min=5)     * })     */    public string $name = '';}
复制代码


PHP 8.1


class User{    #[\Assert\All(        new \Assert\NotNull,        new \Assert\Length(min: 6))    ]    public string $name = '';}
复制代码
纯交集类型


此前 PHP 版本


function count_and_iterate(Iterator $value) {    if (!($value instanceof Countable)) {        throw new TypeError('value must be Countable');    }
foreach ($value as $val) { echo $val; }
count($value);}
复制代码


PHP 8.1


function count_and_iterate(Iterator&Countable $value) {    foreach ($value as $val) {        echo $val;    }
count($value);}
复制代码


当一个值需要同时满足多种约束类型时,则应使用交集类型。目前开发者还无法将交集类型与 8.0 版本中联合类型混合使用,例如 A&B|C。

Never 返回类型


此前 PHP 版本


function redirect(string $uri) {    header('Location: ' . $uri);    exit();}
function redirectToLoginPage() { redirect('/login'); echo 'Hello'; // <- dead code}
复制代码


PHP 8.1


function redirect(string $uri): never {    header('Location: ' . $uri);    exit();}
function redirectToLoginPage(): never { redirect('/login'); echo 'Hello'; // <- dead code detected by static analysis}
复制代码


使用 never 类型声明的函数或方法将不会返回值,且只能通过抛出异常或调用 die()、exit()、trigger_error()等情况结束脚本执行。

最终类常量


此前 PHP 版本


class Foo{    public const XX = "foo";}
class Bar extends Foo{ public const XX = "bar"; // No error}
复制代码


PHP 8.1


class Foo{    final public const XX = "foo";}
class Bar extends Foo{ public const XX = "bar"; // Fatal error}
复制代码


现在可以声明最终类常量,确保它们不会在子类中被覆盖。

显式八进制数字表示法


此前 PHP 版本


016 === 16; // false because `016` is octal for `14` and it's confusing016 === 14; // true
复制代码


PHP 8.1


016 === 16; // false because `016` is octal for `14` and it's confusing016 === 14; // true
复制代码


现在开发者可以使用显式 0o 前缀写入八进制数。

纤程(Fibers)


此前 PHP 版本


$httpClient->request('https://example.com/')        ->then(function (Response $response) {            return $response->getBody()->buffer();        })        ->then(function (string $responseBody) {            print json_decode($responseBody)['code'];        });
复制代码


PHP 8.1


$response = $httpClient->request('https://example.com/');print json_decode($response->getBody()->buffer())['code'];
复制代码


纤程是用于实现轻量级协作并发的原语。这种方法能够创建出如生成器般暂停并恢复代码块的方法,且可以从堆栈中的任何位置处进行。但请注意,纤程本身并不能实现并发性,而仍然需要依靠事件循环。但纤程的出现使得阻塞与非阻塞实现能够共享同一 API。


纤程让开发者摆脱以往常见于 Promiss::then()或基于生成器的样板代码。各类库大多会围绕纤程构建进一步抽象,因此大家无需直接与这种低级并发机制交互。

使用字符串键解包数组


此前 PHP 版本


$arrayA = ['a' => 1];$arrayB = ['b' => 2];
$result = array_merge(['a' => 0], $arrayA, $arrayB);
// ['a' => 1, 'b' => 2]
复制代码


PHP 8.1


$arrayA = ['a' => 1];$arrayB = ['b' => 2];
$result = ['a' => 0, ...$arrayA, ...$arrayB];
// ['a' => 1, 'b' => 2]
复制代码


PHP 之前已经支持通过扩展运算符实现数组解包,但之前只适用于包含整数键的数组。现在,这项功能也可解包字符串键数组。

性能改进


Symfony Demo App 请求时间

25 次连续运行,250 次请求(秒)(结果越低越好)



结果(相较于 PHP 8.0):


  • Symfony Demo 提速 23.0%

  • WordPress 提速 3.5%


PHP 8.1 中的性能相关变动:


  • 面向 ARM64 的 JIT 后端(AArch64)

  • 继承缓存(避免在各个请求中重新链接类)

  • 快速类名解析(避免小写与哈希查找)

  • timelib 与 ext/date 性能改进

  • SPL 文件系统迭代器改进序列化/把

  • 序列化优化

  • 对一些内部函数做出优化 (get_declared_classes(), explode(), strtr(), strnatcmp(), dechex())

  • JIT 改进与修复

新的类、接口与函数


  • 新的 #[ReturnTypeWillChange]属性。

  • 新的 fsync 与 fdatasync 函数。

  • 新的 array_is_list 函数。

  • 新的 Sodium XChaCha20 函数。

弃用与向下兼容性变动


  • 不推荐将 null 传递至不可为 null 的内部函数参数。

  • PHP 内置类方法中的 tentative 返回类型。

  • 不推荐使用可序列化接口。

  • HTML 实体编/解码函数默认处理并替换掉单引号。

  • $GLOBALS 变量约束。

  • 将 MySQLi: Default 错误模式设置为异常。

  • 不推荐使用隐式不兼容的浮点数到整数转换。

  • finfo 扩展:file_info 资源迁移至现有 finfo 对象。

  • IMAP:imap 资源迁移至 IMAP\Connection 类对象。

  • FTP 扩展:Connection 资源迁移至 FTP\Connection 类对象。

  • GD 扩展:字体标识符迁移至 GdFont 类对象。

  • LDAP:资源迁移至 LDAP\Connection、LDAP\Result 以及 LDAP\ResultEntry 对象。

  • PostgreSQL:资源迁移至 PgSql\Connection、PgSql\Result 以及 PgSql\Lob 对象。

  • Pspell:pspell 与 pspell config 资源迁移至 PSpell\Dictionary 及 PSpell\Config 类对象。

PHP 近期动态

PHP 前十的地位岌岌可危


全球知名 TIOBE 编程语言社区最新发布 11 月的编程语言排行榜。据最新榜单显示,PHP 前十的地位岌岌可危。


自 20 多年前 TIOBE 指数开始发布以来,PHP 一直稳居前 10 名,然而最近它已经开始在前十的边缘苦苦挣扎。TIOBE CEO Paul Jansen 称,“尽管 PHP 曾经是 Web 编程领域的领导者,但现在它在这个领域面临着激烈的竞争。这并不是说 PHP 已经死了,仍然有很多中小型企业在依赖 PHP。


所以我预计 PHP 会进一步下降,但速度会很慢。PHP 的两个竞争对手,Ruby 和 Groovy,本月都前进了 3 个位置。具体表现为 Ruby 从第 16 位上升到第 13 位,Groovy 从第 15 位上升到第 12 位。”


最新数据显示,PHP 在 11 月份的市场占比是 1.81%, 排名从第 8 下降至第 10。两个竞争对手 Groovy 和 Ruby 在 11 月市场占比分别是 1.51%、1.43%。除此之外 Groovy 和 Ruby 的名次也有大幅提升,Groovy 从 15 名 上升到 12 名,Ruby 从 16 名上升到 13 名 。

PHP 基金会成立


11 月 22 日,PhpStorm 的开发商 JetBrains 宣布,将与 Automattic、Laravel、Laravel、Acquia 等多家公司共同成立 PHP 基金会。


公告表示,PHP 基金会将是一个非营利组织,其使命是保证 PHP 语言的生命力和繁荣。同时,该基金会将通过 Open Collective 来实现。


此外,基金会每年将筹集约 300000 美元,其中,JetBrains 将每年捐款 100000 美元,任何 php-src 的贡献者都可以向基金会申请资助。同时,当前的 RFC 流程不会改变,语言决定将始终留给 PHP Internals 社区。


PHP 基金会的网址为:


https://opencollective.com/phpfoundation


参考链接:https://www.php.net/releases/8.1/en.php

2021-11-26 16:2510693

评论

发布
暂无评论
发现更多内容

MemVerge使得大内存应用在 Ice Lake CPU上如虎添翼

Steven Xu

redis 内存 高性能 持久化存储 kvm

线程池 图解

线程池

【业务架构训练营】模块一作业

汪大侠

常垒资本石矛:寻找ToB投资中的「非共识」

ToB行业头条

SaaS tob

python实现AES/DES/RSA/MD5/SM2/SM4/3DES加密算法模板汇总

小小咸鱼ywy

Python 加密 rsa AES

架构实战营模块1作业

林子钧

作业 架构实战营 模块一

ElasticSearch架构及核心概念

五分钟学大数据

ES 4月日更

Java多线程与并发系列从0到1全部合集!拿走不送~

钟奕礼

Java 编程 程序员 架构 面试

模块一:课后作业

冷酷小绵羊

【架构实战营】模块1作业

毛国庆

架构实战营

Android高级工程师进阶学习,架构师必备技能

欢喜学安卓

android 程序员 面试 移动开发

这份阿里21年最新版Java面试手册简直无敌了,已经助我拿下五个大厂offer!

Java架构之路

Java 程序员 架构 面试 编程语言

架构实战

颜培攀

架构实战营

全网疯传!对标阿里P5-P9的知识体系学习路线及阿里内部Java核心知识手册。

Java架构之路

Java 程序员 架构 面试 编程语言

MemVerge 和百奥智汇用大内存技术加速癌症和新冠病毒的研究

Steven Xu

内存 高性能 持久化存储 I/O

4月17日,HarmonyOS开发者日将于上海启幕

Geek_283163

华为

Substrate 合约书之合约综述

Patract

智能合约

Java-GC概述

Java面试题全部196题合集:涵盖大厂必考的9大技术点

钟奕礼

Java 编程 程序员 架构 面试

架构实战营 模块一:课后作业

Ahu

架构实战营

YouTube视频转MP3音频 (批量、高效、快捷)

科技猫

分享 教程 视频处理 youtube youtube转mp3

2021最新拼多多Java面试题(现场五面),全面涵盖Java高级到高并发

钟奕礼

Java 编程 程序员 架构 面试

带你全面认识CMMI V2.0(五)——改进

IPD产品研发管理

项目管理 管理 软件 CMMI

28次面试从未被拒,只因学了阿里P8大牛写的这份《Java技术成长笔记》

Java架构之路

Java 程序员 架构 面试 编程语言

肝了一个月,终于完成了24万字的Java面试手册!

码农之家

Java 编程 程序员 互联网 面试

在小公司“混”了两年,我只认真做了五件事,如今顺利拿到天猫Offer,迈上人生的新台阶!

Java架构追梦

Java 面试 天猫Offer 成长路线图

1TB每日仅需6元!USnap磁盘快照服务全新上线,精确到秒级恢复

UCloud技术

快照 备份

阿里P9力荐Spring Boot学习笔记,一步一步学习Spring Boot,学到的不单单是基础

Java架构师迁哥

架构实战营模块1学习总结

林子钧

学习 架构实战营 模块一

架构实战营-模块1-微信业务架构&学生管理系统方案

Lane

别再面向 for 循环编程了,Spring 自带的观察者模式就很香!

Java架构师迁哥

PHP 8.1 发布:新增枚举功能_语言 & 开发_核子可乐_InfoQ精选文章