发布于 2026-01-06 2 阅读
0

PHP 8 发布啦!!

PHP 8 发布啦!!

PHP于2020年11月26日发布了新版本。PHP是一个递归缩写,类似于GNU,代表PHP:超文本预处理器(Hypertext Preprocessor)。它是Web开发领域最常用的后端语言之一。尽管现在出现了NodeJS、Django、Flask、Laravel、Drupal等新的Web开发框架,但PHP仍然是后端市场的主要参与者。PHP是一种通用脚本语言,尤其适用于Web开发。它最初由丹麦裔加拿大程序员Rasmus Lerdorf于1994年创建。

PHP开发团队对其新版本声明如下:

“PHP 8.0 是 PHP 语言的一次重大更新。
它包含许多新特性和优化,包括命名参数、联合类型、属性、构造函数属性提升、匹配表达式、空安全运算符、JIT,以及类型系统、错误处理和一致性方面的改进。”

新版本的主要变化包括:

  • 命名参数
  • 属性
  • 建筑商房地产推广
  • 联合类型
  • 匹配表达式
  • 空安全运算符
  • 内部函数的一致性类型错误
  • 新型 JIT 编译引擎

以下列出部分变更的详情。

命名参数

仅指定必需参数,省略可选参数。
参数顺序无关,且参数本身已明确说明。

// PHP 7
htmlspecialchars($string, ENT_COMPAT | ENT_HTML401, 'UTF-8', false);
Enter fullscreen mode Exit fullscreen mode


// PHP 8
htmlspecialchars($string, double_encode: false);
Enter fullscreen mode Exit fullscreen mode

属性

现在,您可以使用 PHP 的原生语法来编写结构化元数据,而无需使用 PHPDoc 注解。

// PHP 7
class PostsController
{
    /**
     * @Route("/api/posts/{id}", methods={"GET"})
     */
    public function get($id) { /* ... */ }
}
Enter fullscreen mode Exit fullscreen mode


// PHP 8
class PostsController
{
    #[Route("/api/posts/{id}", methods: ["GET"])]
    public function get($id) { /* ... */ }
}
Enter fullscreen mode Exit fullscreen mode

建筑商房地产推广

减少定义和初始化属性所需的样板代码。

//PHP 7
class Point {
  public float $x;
  public float $y;
  public float $z;

  public function __construct(
    float $x = 0.0,
    float $y = 0.0,
    float $z = 0.0,
  ) {
    $this->x = $x;
    $this->y = $y;
    $this->z = $z;
  }
}
Enter fullscreen mode Exit fullscreen mode


// PHP 8
class Point {
  public function __construct(
    public float $x = 0.0,
    public float $y = 0.0,
    public float $z = 0.0,
  ) {}
}
Enter fullscreen mode Exit fullscreen mode

联合类型

您可以使用在运行时进行验证的原生联合类型声明,而不是使用 PHPDoc 注解来表示类型组合。

//PHP 7
class Number {
  /** @var int|float */
  private $number;

  /**
   * @param float|int $number
   */
  public function __construct($number) {
    $this->number = $number;
  }
}

new Number('NaN'); // Ok
Enter fullscreen mode Exit fullscreen mode


//PHP 8
class Number {
  public function __construct(
    private int|float $number
  ) {}
}

new Number('NaN'); // TypeError
Enter fullscreen mode Exit fullscreen mode

匹配表达式

新比赛模式与 Switch 类似,具有以下特点:

  • Match 是一个表达式,这意味着它的结果可以存储在变量中或返回给变量。
  • 匹配分支仅支持单行表达式,不需要 break; 语句。
  • Match 会进行严格的比较。
// PHP 7
switch (8.0) {
  case '8.0':
    $result = "Oh no!";
    break;
  case 8.0:
    $result = "This is what I expected";
    break;
}
echo $result;
//> Oh no!
Enter fullscreen mode Exit fullscreen mode


// PHP 8
echo match (8.0) {
  '8.0' => "Oh no!",
  8.0 => "This is what I expected",
};
//> This is what I expected
Enter fullscreen mode Exit fullscreen mode

空安全运算符

现在,您可以使用带有新空安全运算符的调用链来代替空值检查条件。当链中某个元素的求值失败时,整个链的执行将中止,并且整个链的求值结果为空。

// PHP 7
$country =  null;

if ($session !== null) {
  $user = $session->user;

  if ($user !== null) {
    $address = $user->getAddress();

    if ($address !== null) {
      $country = $address->country;
    }
  }
}
Enter fullscreen mode Exit fullscreen mode


//PHP 8
$country = $session?->user?->getAddress()?->country;
Enter fullscreen mode Exit fullscreen mode

更合理的字符串到数字比较

当与数字字符串进行比较时,PHP 8 使用数字比较。否则,它会将数字转换为字符串,然后使用字符串比较。

// PHP 7
0 == 'foobar' // true
Enter fullscreen mode Exit fullscreen mode


// PHP 8
0 == 'foobar' // false
Enter fullscreen mode Exit fullscreen mode

以下是一些变更内容,要了解所有变更,请访问此链接

文章来源:https://dev.to/amananandrai/php-8-has-released-k51