PHP 8.1 正式发布,带来了诸多创新,例如枚举、Fibers和性能改进。
PHP 是一种服务器端脚本语言,用于开发 Web 应用程序。根据 W3Techs 的数据,78.2% 的网站使用 PHP 并使用已知的服务器端编程语言。换句话说,您在 Internet 上访问的每 10 个网站中几乎有 8 个以某种方式使用 PHP。
在宣布成立PHP 基金会几天后,该语言通过发布最新的 PHP 8.1 更新而不断发展。这个新版本于 2021 年 11 月 25 日发布,包含许多新功能,包括枚举、只读属性、First-class 可调用语法、Fibers、交集类型、性能改进等。
让我们快速浏览一下您应该迁移到 PHP 8.1 的一些新功能、性能调整和其他原因。
PHP 8.1 亮点
对于每一个新的 PHP 版本,我们通常可以期待性能的小幅提升,这次似乎也不例外。这个最新版本还提供了帮助开发人员编写更简洁代码的功能。
枚举(Enumerations)
PHP 8.1 引入了一种名为Enums的新数据类型。它基本上是在一个实体中声明的一组预定义值。枚举是应用程序建模中的重要工具,因为它允许您定义自己的允许状态的微观世界。
现在您可能已经在代码中以一种或另一种方式使用了枚举,但现在 PHP 8.1 将原生支持枚举。这对每个人来说都是个好消息。在最基本的形式中,枚举看起来像这样:
- enum Animal {
- case Dogs;
- case Cats;
- case Birds;
- case Reptiles;
- }
与其他语言类似,这是一种允许预定义值的枚举类型。上面的示例创建一个新的名为枚举类型Animal,它采用下列四个值:Animal::Dogs,Animal::Cats,Animal::Birds和Animal::Reptiles。可以将变量分配给这些值。
Enums 的优点是它们代表了一组常量值,但最重要的是,这些值可以被键入。
Fibers
到目前为止,PHP 仅用于编写同步代码。PHP 8.1 附带了一项激动人心的新功能,用于将异步代码构建到语言Fibers 中。
Fiber的引入旨在消除异步和同步函数之间的区别。
您可以使用 Fibers 开发全栈、可中断的 PHP 函数,然后您可以使用这些函数在 PHP 中实现协作多任务处理。
Fiber 会暂停整个调用堆栈,因此函数的直接调用者无需更改其调用函数的方式。执行可以在调用堆栈中的任何地方使用 Fiber::suspend().
- $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
First-class 可调用语法
First-Class callables是一种引用闭包和函数的新方法。虽然以前您已经可以通过将它们的名称用作字符串或通过创建可调用数组来引用它们,但现在有这种正确的语法可以从任何给定函数创建可调用对象,以便您以后可以调用它。
- $fn = Closure::fromCallable('strlen');
- $fn = strlen(...);
- $fn = Closure::fromCallable([$this, 'method']);
- $fn = $this->method(...)
- $fn = Closure::fromCallable([Foo::class, 'method']);
- $fn = Foo::method(...);
在这个例子中,每对表达式都是等价的。该strlen(...)语法创建一个Closure引用的strlen()功能,等等。
PHP 8.1 中的其他改进
数组和打包现在支持字符串键,并且可以创建类常量,final这样它们就不会被子类覆盖。此外,还有一个新array_is_list()函数可以确定数组是否只有从 0 开始并以 1 递增的数字键,但它是否是实际列表。
PHP 8.1 引入了一种写八进制整数的新方法,我们现在也有 Pure Intersection 类型。这与联合类型相反,它允许任何声明的类型。如果您经常在代码中使用接口,Pure Intersection 类型很有用。
最后是never类型。它是一种返回类型,表示函数永远不会返回。这意味着它将退出或始终抛出异常。
- function redirect(string $url): never {
- header('Location: ' . $url);
- exit();
- }
never 返回类型的目标 是指示和强制执行一个函数,以防止执行其余被调用的代码。
最后但并非最不重要的一点是,PHP 8.1 图像处理和 GD 扩展增加了对 AVIF 图像的支持。与 JPEG、PNG 和 WebP 相比,AVIF 图像可显着减小文件大小,目前Google Chrome和Mozilla Firefox 支持。
PHP 8.1 性能改进
每个 PHP 版本都在性能方面不断改进,PHP 8.1 为现实生活中的应用程序带来了巨大的性能改进。
事实上,PHP 8.1 上的 Symfony 演示应用程序比 PHP 7.4 快约 23%,而 Laravel 在 PHP 8.1 上的运行速度比 PHP 7.4 快约 21.5%。
这是 PHP 8.1 中实现的两项新技术以及许多小的性能修复和调整的结果。所以,当然,很高兴看到 PHP 的性能如何随着每个新的更新而不断提高。