千家信息网

PHP8新特性有哪些及怎么使用

发表于:2025-11-12 作者:千家信息网编辑
千家信息网最后更新 2025年11月12日,这篇文章主要介绍"PHP8新特性有哪些及怎么使用"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"PHP8新特性有哪些及怎么使用"文章能帮助大家解决问题。PHP8
千家信息网最后更新 2025年11月12日PHP8新特性有哪些及怎么使用

这篇文章主要介绍"PHP8新特性有哪些及怎么使用"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"PHP8新特性有哪些及怎么使用"文章能帮助大家解决问题。

PHP8前的PHP

PHP作为一门已经存在了26年的编程语言,可以说是比较长寿的语言了。但是作为一门长寿的语言,他有些与时代脱节了。在运行效率上,不如C语言java语言这样的编译型语言。在安全性上因为使用的人数比较多,所以被发现漏洞的几率也就越多。同时因为语法宽松,发现的漏洞也就更多了,最近版本的PHP7就曾爆出过重大漏洞,如果对安全有较高要求的话,PHP将不再是首选的语言。鉴于这些原因,PHP8的优化方向主要是性能和安全。

PHP8新特性

接下来我们来介绍一下PHP8的新特性,了解一下它做了什么更新。

如果你是初学者,不想关注php8的新特性,或者已经知道了这些新特性,可以直接跳过接下来的一大段介绍,但是相信我,看完这些介绍你会对PHP有一个大的改观。

命名参数

在PHP7中,命名参数的写法为:

htmlspecialchars($string, ENT_COMPAT | ENT_HTML401, 'UTF-8', false);

在PHP8中,命名参数优化为:

htmlspecialchars($string, double_encode: false);
  • 仅仅指定必填参数,跳过可选参数。

  • 参数的顺序无关、自己就是文档(self-documented)

注解

在PHP7中,注解的写法为:

class PostsController
{
/**
* @Route("/api/posts/{id}", methods={"GET"})
*/
public function get($id) { /* ... */ }
}

在PHP8中,注解写法优化为:

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

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

构造器属性提升

在PHP7中,构造器的写法为:

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;
}
}

在PHP8中,构造器的写法优化为:

class Point {
public function __construct(
public float $x = 0.0,
public float $y = 0.0,
public float $z = 0.0,
) {}
}

现在可以用更少的样板代码来定义并初始化属性。

联合类型

在PHP7中,联合类型的写法为:

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

在PHP8中,联合类型的写法优化为:

class Number {
public function __construct(
private int|float $number
) {}
}
new Number('NaN'); // TypeError

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

Match表达式

在PHP7中,match表达式的写法为:

switch (8.0) {
case '8.0':
$result = "Oh no!";
break;
case 8.0:
$result = "This is what I expected";
break;
}
echo $result;
//> Oh no!

在PHP8中,match表达式的写法优化为:

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 使用严格比较。

Nullsafe运算符

在PHP7中,nullsafe运算符的写法为:

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

if ($address !== null) {
$country = $address->country;
}
}
}

在PHP8中,Nullsafe运算符的写法优化为:

$country = $session?->user?->getAddress()?->country;

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

字符串与数字的比较逻辑

在PHP7中,字符串与数字的比较逻辑是这样的:

0 == 'foobar' // true

在PHP8中,字符串与数字的比较逻辑是这样的:

0 == 'foobar' // false

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

内部函数类型错误的一致性

在PHP7中,内部函数类型错误是这样的:

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

在PHP8中对此进行了优化:

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 级异常。

即时编译

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

关于 JIT 对 PHP 8 性能的贡献

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

  • 算术/位运算符更严格的类型检测 RFC

  • Abstract trait 方法的验证 RFC

  • 确保魔术方法签名正确 RFC

  • PHP 引擎 warning 警告的重新分类 RFC

  • 不兼容的方法签名导致 Fatal 错误 RFC

  • 操作符 @ 不再抑制 fatal 错误。

  • 私有方法继承 RFC

  • Mixed 类型 RFC

  • Static 返回类型 RFC

  • 内部函数的类型 Email thread

  • 扩展 Curl、 Gd、 Sockets、 OpenSSL、 XMLWriter、 XML 以 Opaque 对象替换 resource。

其他语法调整和改进

  • 允许参数列表中的末尾逗号 RFC、 闭包 use 列表中的末尾逗号 RFC

  • 无变量捕获的 catch RFC

  • 变量语法的调整 RFC

  • Namespace 名称作为单个 token RFC

  • 现在 throw 是一个表达式 RFC

  • 允许对象的 ::class RFC

新的类、接口、函数

  • Weak Map 类

  • Stringable 接口

  • str_contains()、 str_starts_with()、 str_ends_with()

  • fdiv()

  • get_debug_type()

  • get_resource_id()

  • token_get_all() 对象实现

  • New DOM Traversal and Manipulation APIs

是否升级到PHP8?

PHP 8是一个新的大版本,很多代码的写法都进行了优化,如果要将项目升级为PHP8,代码被破坏的可能性更高,不过如果你使用的是最新版本的PHP,升级起来就会比较轻松,因为其中的大多数重大更改在PHP7中已经弃用。

关于"PHP8新特性有哪些及怎么使用"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注行业资讯频道,小编每天都会为大家更新不同的知识点。

写法 类型 参数 特性 字符 字符串 数字 语言 函数 性能 方法 表达式 运算符 错误 运算 语法 联合 安全 代码 变量 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 广州软件开发教程 奶茶管理系统数据库 深圳享睡网络技术有限公司 show数据库中的表 医保系统软件开发昀锦 数字档案馆网络安全措施 计算机网络技术在国内的应用 福建中小学生教育与网络安全 让数据库的一个值为空字符串 无线接入网络技术概念股 提供在线考试功能的数据库是 网络安全的主观原因有 云备份数据库 服务器日志太多会如何处理 信创数据库产品目录 深圳天众互联网科技公司 软件开发的五个核心原则 北控集团网络安全 数据库设计包括哪两方面设计内容 怎么设置购买轻量服务器地址 对网络金融和网络安全的认识 nodejs操作数据库 我国的网络安全法有哪几部分组成 戴尔服务器的默认密码 海南省互联网科技有限公司 微信数据库文件修复 易语言软件开发视频 互联网络安全研究方向 数据库 复合索引 规范网络安全风险评估加快完善
0