Laragon安装PHP8,相关新特性

2020特殊的一年,在这一年中爆发了新冠疫情,
但在全国人民的努力下,疫情得到了控制。
2020特殊的一年,在这一年中PHP家族迎来了新成员PHP8
在这篇文章中,我们介绍一下php8的安装,以及相关心特性。

一、下载安装

因为本人使用的是 Laragon 集成环境,所以介绍其下安装。

1、下载 PHP8 放到环境目录下 D:\laragon\bin\php下载地址

根据自己的本地环境,选择合适的版本,我下载的是php-8.0.1-Win32-vs16-x64.zip

冯奎博客

因为 PHP8 需要 VS16 版本的 Apache,所以我们还需要去下载 Apache下载地址
下载后放到对应的 Apache 目录下,

冯奎博客

2、开启扩展,修改配置

刚下载完的php中相关扩展是关闭的,这时我们需要打开 php.ini 开启相关扩展
搜索 extension=bz2 ,根据需要,开启以下扩展

;extension=bz2
extension=curl
extension=fileinfo
extension=gd
extension=intl
extension=mbstring
extension=mysqli
extension=openssl
extension=pdo_mysql

extension=xsl

这时启动 PHP8Apache 会报一个关于 php8_module 错误

冯奎博客

打开 mod_php.conf 文件。把php8_module 修改成 php_module即可

冯奎博客

# This file is auto-generated, so please keep it intact.
LoadModule php_module "D:/laragon/bin/php/php-8.0.1-Win32-vs16-x64/php8apache2_4.dll"
PHPIniDir "D:/laragon/bin/php/php-8.0.1-Win32-vs16-x64"
<IfModule mime_module>
    AddType application/x-httpd-php .php
</IfModule>

3、启动测试

切换PHP版本,启动相关服务

冯奎博客

打开 http://localhost/phpinfo.php

冯奎博客

二、PHP8相关新特性

引入即时编译,优化性能与运行速度

PHP 8 引入了两个即时编译引擎。 Tracing JIT 在两个中更有潜力,它在综合基准测试中显示了三倍的性能, 并在某些长时间运行的程序中显示了 1.5-2 倍的性能改进。 典型的应用性能则和 PHP 7.4 不相上下。

关于 JITPHP 8 性能的贡献

冯奎博客


1、命名参数 RFC

// PHP 7
htmlspecialchars($string, ENT_COMPAT | ENT_HTML401, 'UTF-8', false);
// PHP 8
htmlspecialchars($string, ENT_COMPAT | ENT_HTML401, 'UTF-8', false);
  • 仅仅指定必填参数,跳过可选参数。
  • 参数的顺序无关、自己就是文档(self-documented)

2、注解 RFC Doc

// PHP 7
class PostsController
{
    /**
     * @Route("/api/posts/{id}", methods={"GET"})
     */
    public function get($id) { /* ... */ }
}
// PHP 8
class PostsController
{
    #[Route("/api/posts/{id}", methods: ["GET"])]
    public function get($id) { /* ... */ }
}

现在可以用 PHP 原生语法来使用结构化的元数据,而非 PHPDoc 声明。

3、构造器属性提升 RFC 文档

// 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;
  }
}
// PHP 8
class Point {
  public function __construct(
    public float $x = 0.0,
    public float $y = 0.0,
    public float $z = 0.0,
  ) {}
}

更少的样板代码来定义并初始化属性。

4、联合类型 RFC 文档

// PHP 7
class Number {
  /** @var int|float */
  private $number;
  /**
   * @param float|int $number
   */
  public function __construct($number) {
    $this->number = $number;
  }
}
new Number('NaN'); // Ok
// PHP 8
class Number {
  public function __construct(
    private int|float $number
  ) {}
}
new Number('NaN'); // TypeError

相较于以前的 PHPDoc 声明类型的组合, 现在可以用原生支持的联合类型声明取而代之,并在运行时得到校验。

5、Match 表达式 RFC 文档

// 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!
// PHP 8
echo match (8.0) {
  '8.0' => "Oh no!",
  8.0 => "This is what I expected",
};
//> This is what I expected

新的 match 类似于 switch,并具有以下功能:

  • Match 是一个表达式,它可以储存到变量中亦可以直接返回。
  • Match 分支仅支持单行,它不需要一个 break; 语句。
  • Match 使用严格比较。

6、Nullsafe 运算符 RFC

// PHP 7
$country =  null;
if ($session !== null) {
  $user = $session->user;
  if ($user !== null) {
    $address = $user->getAddress();
 
    if ($address !== null) {
      $country = $address->country;
    }
  }
}
// PHP 8
$country = $session?->user?->getAddress()?->country;

现在可以用新的 nullsafe 运算符链式调用,而不需要条件检查 null。 如果链条中的一个元素失败了,整个链条会中止并认定为 Null。

7、字符串与数字的比较更符合逻辑 RFC

// PHP 7
0 == 'foobar' // true
// PHP 8
0 == 'foobar' // false

PHP 8 比较数字字符串(numeric string)时,会按数字进行比较。 不是数字字符串时,将数字转化为字符串,按字符串比较。

8、内部函数类型错误的一致性。 RFC

// PHP 7
strlen([]); // Warning: strlen() expects parameter 1 to be string, array given
array_chunk([], -1); // Warning: array_chunk(): Size parameter expected to be greater than 0
// PHP 8
strlen([]); // TypeError: strlen(): Argument #1 ($str) must be of type string, array given
array_chunk([], -1); // ValueError: array_chunk(): Argument #2 ($length) must be greater than 0

现在大多数内部函数在参数验证失败时抛出 Error 级异常。

类型系统与错误处理的改进

  • 算术/位运算符更严格的类型检测 RFC
  • Abstract trait 方法的验证 RFC
  • 确保魔术方法签名正确 RFC
  • PHP 引擎 warning 警告的重新分类 RFC
  • 不兼容的方法签名导致 Fatal 错误 RFC
  • 操作符 @ 不再抑制 fatal 错误。
  • 私有方法继承 RFC
  • Mixed 类型 RFC
  • Static 返回类型 RFC
  • 内部函数的类型 Email thread
  • 扩展 CurlGdSocketsOpenSSLXMLWriterXML 以 Opaque 对象替换 resource。

其他语法调整和改进

  • 允许参数列表中的末尾逗号 RFC、 闭包 use 列表中的末尾逗号 RFC
  • 无变量捕获的 catch RFC
  • 变量语法的调整 RFC
  • Namespace 名称作为单个 token RFC
  • 现在 throw 是一个表达式 RFC
  • 允许对象的 ::class RFC

新的类、接口、函数

本文参考文档:
1、不支持PHP8?
2、教程如何在Windows上升级PHP 8 [完成]
3、https://www.php.net/releases/8.0/zh.php

冯奎博客
请先登录后发表评论
  • latest comments
  • 总共0条评论