在本篇文章中我们来了解新的 PHP 8 版本中的新功能和变化。
期待已久的 PHP 8.0 GA 版本计划于 2020 年 11 月 26 日发布。让我们来看看 PHP 8 中的一些新增功能。
新增功能
Union 联合类型
PHP 8 现在支持联合类型,它允许我们在类或参数中声明多个类型。 在版本 8 之前,PHP 已经支持两种特殊的联合类型:nullable
和 iterable
。
// Nullable - 返回的数据类型可以是 string 或者 null
function getUsername() : ?string {
return $this->username;
}
// Iterable pseudo-type - 返回的数据类型可以是数组或者 Traversable 的实例
function iterate() : iterable {
// ...
}
在 PHP 8 中,这些特殊的联合类型已被扩展为包括多种组合,但也有一些例外。
// Union - 返回的数据类型可以是 int 或者 float
function getNumber() : int|float {
return $this->number;
}
// Nullable 实现为新的联合类型
function getUsername() : string|null {
return $this->username;
}
mixed 类型
PHP 8 为 PHP 类型系统引入了一种新的伪类型:mixed
。 此伪类型允许我们声明任何类型的值,而无需完全排除类型信息。
显式混合类型允许人们向参数、类属性和函数返回添加类型,以表明类型信息没有被遗忘,只是不能更精确地指定,或者程序员明确决定不这样做
为了了解 mixed 类型包括的所有类型,这里将 mixed 表示为联合类型:
array|bool|callable|int|float|null|object|resource|string
JIT (Just in Time compiler)
在编译语言中,源代码提前转换为计算机可读代码。 另一方面,解释型语言在执行源代码时对其进行转换,这要慢得多。 PHP 是一种解释型语言,过去曾有过几种提高 PHP 性能的策略。
提高性能的最新举措是在 PHP 8 中添加了 JIT 编译器。
JIT 编译器是一种介于编译和解释之间的中间地带。 它将在运行时编译和缓存一些代码部分,以便可以使用编译版本而不是解释版本。 这可能会为 PHP 带来巨大的性能提升,但有一些警告。 通常,JIT 编译器主要有利于 CPU 密集型应用程序,例如 3D 渲染或大型数学计算。 如果您将 PHP 用于 Web 应用程序,则启用 JIT 编译器可能不会显着提升性能。
注意
:默认情况下不启用 JIT。 如果要使用JIT,需要我们自己手动来开启。
str_contains 函数
新的 str_contains
函数可用于检查给定字符串是否包含另一个字符串。
str_contains ( string $haystack , string $needle ) : bool
下面看一个示例
str_contains("PHP is cool!", "PHP"); // true
str_contains("PHP is cool!", "php"); // false
str_contains("PHP is cool!", "not"); // false
注意:str_contains 函数是大小写敏感的
Named Arguments 命名参数
命名参数是 PHP 8 的另一个新增功能。使用命名参数,我们现在可以根据参数名称将参数传递给函数。 这意味着传递参数的顺序无关紧要,因为名称将用于确定参数。
createUser(id: 1, username: hollylawly);
// 参数的位置无关紧要
createUser(username: hollylawly, id: 1);
match 表达式
PHP 8 中引入的 match 表达式类似于 switch 语句,但有一些改进:
- match 计算表达式的结果,因此我们无需记住在每种情况下都设置一些变量
- 没有像 switch 语句中那样的类型强制
- 每个分支后都会添加隐式 break,因此如果您忘记添加 break,也不会遇到失败
下面看一个示例
$operation = 'write';
// Switch 语句
switch ($operation) {
case 'read':
$message = 'Viewed!';
break;
case 'write':
$message = 'Created!';
break;
case 'update':
$message = 'Updated!';
break;
case 'delete':
$message = 'Deleted!';
break;
}
// 等价的 match 表达式
$message = match ($operation) {
'read' => 'Viewed!',
'write' => 'Created!',
'update' => 'Updated!',
'delete' => 'Deleted!',
}
注意
:match 现在是保留关键字
参数列表中的尾随逗号
这个很简单,但一定会让很多人开心! 与参数列表一样,我们现在也可以在参数列表的末尾去掉尾随逗号。
function myFunction(
param1,
param2,
param3,
) {
// ...
}
另一个好处是它简化了添加参数的差异。 而不是改变两行(在最后一个参数和带有新参数的行添加逗号),只会突出显示一行。
// --- 没有尾随逗号的差异
// Before
function myFunction(
param1,
param2,
param3
) {
// ...
}
// After
function myFunction(
param1,
param2,
param3, // ? 这一行改变了
param4 // ? 这一行改变了
) {
// ...
}
// --- 带尾随逗号的差异
// Before
function myFunction(
param1,
param2,
param3,
) {
// ...
}
// After
function myFunction(
param1,
param2,
param3,
param4, // ? 这一行改变了
) {
// ...
}
PHP 8 的支持
因为 PHP 8 已经出现了很长时间,所以已经完成了许多社区工作以确保它在整个网络上得到支持。 但是在升级之前,我们应该确保无论在哪里使用它都受到支持。
以下是一些热门项目、框架、应用程序等的当前支持状态。
WordPress
WordPress 计划在其下一个版本 (v5.6) 中支持 PHP 8,该版本目前已于 2020 年 12 月 8 日发布。这不会影响当前所需的最低版本,即 PHP 5.6.2。
因为这是一个主要的版本更改,所以需要进行大量测试。 如果有兴趣通过 PHP 8 测试帮助 WordPress 社区,请务必查看他们的测试呼吁。
Laravel
Laravel 团队提前完成了 PHP 8 支持所需的所有更新。 这包括对以下项目的更新:
- Faker
- guzzlehttp
- mockery
- doctrine/dbal
- PHPUnit
Symfony
Symfony 团队已经准备好从一开始就支持 PHP 8。 如果我们对 Symfony 中支持 PHP 8 的过程感到好奇,可以看一下 JetBrains 的 Nikita Popov 采访 Symfony 的首席工程师 Nikolas Grekas 的视频。
“我们很高兴。进展非常顺利。PHP 8 很容易支持。” — Nicolas Grekas
总结
PHP 8 的发布已经投入了大量工作,毫无疑问,PHP 社区很高兴能够得到它。
有关更改的完整列表或了解引入某些内容的原因,请务必查看 PHP 8 的已实现 RFC 。