迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 >

PHP 8 中的那些新功能

作者:迹忆客 最近更新:2022/06/14 浏览次数:

在本篇文章中我们来了解新的 PHP 8 版本中的新功能和变化。

期待已久的 PHP 8.0 GA 版本计划于 2020 年 11 月 26 日发布。让我们来看看 PHP 8 中的一些新增功能。

新增功能

Union 联合类型

PHP 8 现在支持联合类型,它允许我们在类或参数中声明多个类型。 在版本 8 之前,PHP 已经支持两种特殊的联合类型:nullableiterable

// 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

除非注明转载,本站文章均为原创或翻译,欢迎转载,转载请以链接形式注明出处

本文地址:

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

热门文章

教程更新

热门标签

PHP
扫码一下
查看教程更方便