never 是 php 8.1 引入的底部类型,表示函数绝不会正常返回,仅允许 throw、exit/die 或无限循环;禁止 return、不可为空(?never 非法),与 void 语义完全不同。

PHP 8.1 引入的 never 是一种特殊返回类型,它明确告诉调用方:“这个函数执行后,控制流绝不会继续到下一行”。它不是“不返回值”,而是“根本不可能正常返回”——要么抛异常、要么终止脚本、要么死循环。
never 函数的定义规则
声明为 never 的函数必须确保**100% 不会到达函数末尾或执行 return 语句**。否则 PHP 会报致命错误,PHPStan 也会标记 return.never 错误。
- 函数签名必须显式写
: never,且不能加问号(?never是非法的,PHPStan 会报nullableType.never) - 函数体内禁止出现
return;或return $value; - 允许的操作只有三类:抛出异常(
throw)、终止执行(exit()/die())、无限循环(while(true) { ... })
典型使用场景和示例
never 类型适合封装那些“终结当前流程”的逻辑,让类型系统帮你守住边界。
-
快速失败函数:
function abort(string $msg): never { throw new RuntimeException($msg); } -
重定向并退出:
function redirect(string $url): never { header("Location: $url"); exit(302); } -
紧急终止:
function die_with_code(int $code): never { exit($code); } -
占位死循环(调试/协议未实现):
function not_implemented(): never { while (true) { usleep(1000); } }
never 和 void 的关键区别
别把 never 当成加强版 void。它们语义完全不同:
-
void表示“可以返回,但不返回有意义的值”,允许return;,也允许函数自然结束 -
never表示“控制流在此中断,后续代码不可达”,函数体里任何return都是错误 - 类型系统中,
never是底部类型(bottom type),它是所有类型的子类型;而void没有这种关系
配合静态分析工具的注意事项
用好 never 离不开 PHPStan 这类工具:
- 遇到
return.never报错?说明你写了return;—— 删掉,改用throw或exit() - 遇到
nullableType.never?说明你写了?never—— 这是语法错误,never 不能可空,直接改成never - PHPStan 的
ignorable: false错误(如nullableType.never)必须修复代码,不能靠 ignore 忽略
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











