never类型表示函数永不正常返回,必须通过throw、exit/die或死循环终止,禁止return语句、不可空化(?never非法)、不可联合(string|never非法),且所有执行路径须确保终止。

在 PHP 8.1+ 中,never 类型专门用于标记**确实不会返回**的函数——它不是“不返回值”,而是“根本不会执行到函数结束”。只要函数体内有 throw、exit()、die() 或死循环,且**保证不会走到末尾或显式 return**,就可以安全标注 : never。
必须满足的三个条件
声明 : never 不是可选修饰,而是一种契约。PHP 运行时和静态分析器(如 PHPStan)会严格校验:
- 函数体内不能出现
return语句(包括隐式返回,如函数末尾无 return) - 必须至少触发一次不可恢复的终止行为:抛出未被捕获的异常、调用
exit()/die()、或进入无限循环 - 所有执行路径都必须导向上述终止行为——没有“漏网之鱼”分支
正确写法示例
以下都是合法且典型的 never 函数定义:
function abort(string $message): never { throw new RuntimeException($message); }function die_with_code(int $code): never { exit($code); }function panic(): never { while (true) { usleep(1000); } }function unreachable(): never { throw new LogicException('This should never be called'); }
常见错误与禁止写法
这些写法会直接导致 PHP 致命错误或 PHPStan 报错(如 return.never 或 nullableType.never):
- 写
return;或return null;—— 触发return.never错误 - 声明
?never或string|never——never不能参与可空或联合类型 - 函数里有未覆盖的分支,比如
if ($x) { throw ...; }却没处理else—— 运行时报Fatal error: Function must not return - 试图给内置函数加
never(如function strlen(string $s): never)—— 语法非法,且破坏类型契约
实际使用建议
never 最适合封装项目级的终止逻辑,让类型系统帮你守住控制流边界:
- 统一错误中断点(如框架中的
abort()、fail()) - CLI 命令中提前退出(
if ($help) { showHelp(); exit(0); }可封装为showHelpAndExit(): never) - 替代裸写的
die("xxx"),提升 IDE 自动补全和静态检查能力 - 配合 PHPStan 的
return.never检查,快速发现“本该终止却意外返回”的逻辑漏洞
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











