本文目录导读:

在 PHP 中,永不返回类型(Never Return Type)是 PHP 8.1 引入的一个特性,使用 never 关键字声明。
基本概念
never 类型表示函数永远不会正常返回,要么抛出异常,要么调用 exit()/die() 终止脚本。
语法与用法
function redirect(string $url): never {
header("Location: $url");
exit; // 必须有终止语句
}
function throwError(string $message): never {
throw new Exception($message);
}
关键特性
必须终止执行
never 类型的函数必须以以下方式结束:
- 抛出异常
- 调用
exit()或die() - 调用其他
never类型的函数
// ❌ 错误:函数可能正常返回
function badFunction(): never {
if (true) {
exit;
}
// 缺少终止语句,PHP 会报错
}
// ✅ 正确:所有路径都终止
function goodFunction(int $num): never {
if ($num > 0) {
throw new RuntimeException("正数");
}
exit;
}
与 void 的区别
| 特性 | never |
void |
|---|---|---|
| 返回值 | 不允许返回任何值 | 不允许返回值 |
能否返回 null |
不能 | 不能 |
| 函数正常结束 | 禁止 | 允许 |
| 实际使用场景 | 异常、exit | 无返回值的普通函数 |
function normalFunction(): void {
echo "正常结束";
// 函数到这里就结束,可以不用 return
}
// 不能修改为 never,因为可能正常返回
继承规则
never 可以作为协变返回类型(可以用于子类覆盖):
class ParentClass {
public function error(): never {
throw new Exception("父类错误");
}
}
class ChildClass extends ParentClass {
public function error(): never {
throw new Exception("子类错误");
}
}
实际应用场景
统一异常处理
function abort(string $message): never {
http_response_code(500);
echo json_encode(['message' => $message]);
exit;
}
抽象类定义接口
interface Validator {
public function validate($data): never; // 无效时抛出异常
}
class EmailValidator implements Validator {
public function validate($data): never {
if (!filter_var($data, FILTER_VALIDATE_EMAIL)) {
throw new InvalidArgumentException("无效的邮箱");
}
// 注意:这里没有 else 分支,如果验证通过呢?
// 实际上这个接口设计有问题,通常不会这样用
}
}
帮助函数
function dd($variable): never {
var_dump($variable);
die;
}
function dumpExit($data): never {
print_r($data);
exit;
}
静态分析优势
使用 never 类型可以明显改善代码的静态分析:
function validateUser(array $user): void {
if (!isset($user['name'])) {
throwInvalidUser();
}
// 静态分析器知道到这里 user['name'] 一定存在
echo $user['name'];
}
function throwInvalidUser(): never {
throw new Exception("用户数据无效");
}
注意事项
- 不能与 一起使用:
?never是无效的 - 不能作为参数类型:
function foo(never $x)不允许 - 属性不能使用:类属性不能用
never类型 - 无法显式返回:函数体内不能有
return;语句
版本兼容
- PHP 8.1+:支持
never类型 - PHP 7.x 及更早版本:不支持,需要避免使用
// PHP 8.1 实现
function exitApp(): never { ... }
// PHP 7.4 替代方案(无强制类型)
function exitApp(): void {
exit;
}
never 类型特别适合用于异常抛出函数、断言函数、中断流程的控制函数等场景,它能让其他开发人员和静态分析工具清楚地理解函数的语义。