never 是 php 8.1 引入的返回类型,表示函数绝不会正常返回,仅适用于用户自定义函数,用于声明抛出异常、exit/die 或无限循环的终止行为,不可用于内置函数或联合类型。

never 是 PHP 8.1 引入的返回类型声明,表示函数绝不会正常返回——它要么抛出异常,要么调用 exit()/die(),要么进入无限循环。它不能用于内置函数的自定义定义,因为内置函数(如 echo、strlen、json_encode 等)是 C 实现的,其签名由 Zend 引擎硬编码,PHP 层无法“重新定义”它们的返回类型。
你真正能使用 never 的地方,是自己写的用户函数,且明确设计为“不返回”。
✅ 正确用法:用户自定义函数声明 never
function abort(string $message): never
{
throw new RuntimeException($message);
}
function die_with_code(int $code): never
{
exit($code);
}
function loop_forever(): never
{
while (true) {
// 不会退出
}
}
这些函数一旦被调用,执行流就终止,所以 PHP 类型系统允许你用 never 告诉调用方:“这里之后的代码不可达”。
⚠️ 注意:
never不能出现在联合类型中(如string|never是非法的),也不能作为属性、参数或变量类型。
❌ 常见误解澄清
内置函数不能加
never类型声明
你不能写function strlen(string $str): never { ... }—— 这语法错误,且strlen()本来就是返回int,强行改会破坏兼容性。never不是“空返回”或“void”void表示函数不返回值(但会正常结束);never表示根本不会结束(或以非正常方式终止)。exit()和throw是触发never语义的关键动作
如果函数里没出现throw、exit、die或死循环,即使声明了never,运行时也会报错(Fatal error: Uncaught Error: Function ... must not return)。
? 实际建议:何时该用 never
- 写统一的错误终止函数(如框架中的
abort()、fail()) - 封装 CLI 工具的提前退出逻辑
- 替代全局
die("xxx"),提升类型安全和 IDE 提示能力
(例如:调用abort("not found")后,后续代码会被静态分析器标记为“不可达”)
function handleNotFound(): never
{
http_response_code(404);
echo "Page not found";
exit(404);
}
// 下面这行在支持 PHP 8.1+ 的 IDE 或 Psalm/PHPStan 中会被标灰(不可达)
log_access("404 occurred"); // ← 这行永远不会执行
? 补充:never 在类型系统中的角色
- 它是类型理论里的底类型(bottom type),是所有类型的子类型
→ 所以你可以把never函数赋给任何返回类型的callable变量(类型安全)
$callback: callable(): int = function (): never {
throw new Exception();
};
// 合法:never 可赋给 int 类型位置(因为 never ⊆ int)
但反过来不行:int 函数不能赋给 callable(): never。
不复杂但容易忽略:never 的价值不在运行时,而在编译期类型推导与代码可维护性。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











