PHP 8 新特性:让代码更严谨与高效
PHP 8 的发布为语言带来了革命性的变化,其中联合类型(Union Types)和匹配表达式(Match Expression)显著提升了代码的健壮性和可读性。
告别模糊,拥抱联合类型
在 PHP 7 时代,我们主要通过 DocBlock 的 @param int|string $id 来注释一个参数允许多种类型。但这只是“文档说明”,运行时并无法强制约束。
PHP 8 的联合类型将其正式化:
// PHP 7: 仅存在于注释中
/**
* @param int|string $id
*/
public function find($id) {
}
// PHP 8: 语言级别支持,运行时检查
public function find(int|string $id): User|null
{
// 函数体
}
现在,如果你错误地传入一个数组 find([1]),PHP 会直接抛出 TypeError 异常,将类型错误扼杀在开发阶段,而不是在生产环境中引发难以追踪的诡异行为。
更简洁强大的 match 表达式
switch 语句长期以来存在一些陷阱:容易忘记 break 导致的意外贯穿,以及类型松比较可能带来的问题。
PHP 8 的 match 解决了这些问题:
// 传统的 switch
switch ($statusCode) {
case 200:
$message = 'OK';
break;
case 404:
$message = 'Not Found';
break;
default:
$message = 'Unknown';
}
// 现代的 match
$message = match($statusCode) {
200 => 'OK',
404 => 'Not Found',
default => 'Unknown',
};
match 是一个表达式,它直接返回结果,无需额外的变量赋值。它进行严格比较(===),避免了类型转换的陷阱。并且,它不允许贯穿,每个条件都是独立且安全的。
小结
联合类型让你的接口契约更加明确,减少了不可预知的输入错误。匹配表达式则提供了比 switch 更安全、更简洁的逻辑控制流。这些特性共同推动着 PHP 开发现代化的进程,帮助我们写出更少 Bug、更易维护的代码。是时候在你的新项目中实践它们了。