PHP never 关键字
最后修改于 2025 年 4 月 16 日
PHP never
返回类型表示一个永不返回的函数。它是在 PHP 8.1 中引入的。使用 never 类型的函数要么抛出异常,要么终止执行。这与 void 类型有所不同,void 类型会正常完成。
基本定义
never
类型代表不会将控制权返回给调用者的函数。这包括始终抛出异常或退出的函数。never 类型是 PHP 类型系统中的一个底部类型。
语法:function foo(): never { ... }
。never 返回类型必须显式声明。使用 never 类型的函数不能有 return 语句。
主要特征:不允许返回值,必须终止执行,适用于致命错误或无限循环。它有助于静态分析工具。
基本 never 函数
此示例展示了一个始终抛出异常的简单函数。
<?php declare(strict_types=1); function fail(string $message): never { throw new RuntimeException($message); } fail("Operation failed");
fail
函数声明了 never 返回类型。它总是抛出异常,从不正常返回。对 fail 的调用会终止执行。这是 never 的一个常见用例。
never 与 exit()
此示例演示了将 never 与 exit() 函数一起使用。
<?php declare(strict_types=1); function shutdown(): never { echo "Shutting down..."; exit(1); } shutdown(); echo "This will never be executed";
shutdown
函数调用 exit(),终止脚本。never 类型正确地表明了这种行为。shutdown() 调用之后的代码是不可达的。这有助于捕获逻辑错误。
never 在错误处理中
此示例展示了在错误处理场景中使用 never。
<?php declare(strict_types=1); function handleError(string $message): never { error_log($message); http_response_code(500); exit(1); } try { // Some operation that might fail throw new Exception("Database connection failed"); } catch (Exception $e) { handleError($e->getMessage()); }
handleError
函数记录错误并终止。never 类型清楚地传达了这种行为。这种模式在关键错误处理程序中很常见。它阻止了进一步的执行。
never 与无限循环
此示例演示了 never 与无限循环一起使用。
<?php declare(strict_types=1); function runForever(): never { while (true) { echo "Running...\n"; sleep(1); } } runForever(); echo "This line is unreachable";
runForever
never 在 Switch 默认情况下
此示例使用 never 用于详尽的 switch 语句。
<?php declare(strict_types=1); function processStatus(string $status): string { return match ($status) { 'success' => 'Operation succeeded', 'pending' => 'Operation pending', default => throw new LogicException("Invalid status"), }; } echo processStatus('success');
match 表达式在 default case 中使用 throw。这确保了所有情况都被处理。如果提取到单独的函数中,将使用 never 类型。这种模式强制进行详尽的匹配。
never 与类型检查
此示例展示了 never 如何与 PHP 的类型系统一起工作。
<?php declare(strict_types=1); function terminate(): never { exit(0); } function foo(): string { terminate(); // No return needed because terminate() is never } echo foo();
foo
函数调用 terminate(),它永远不会返回。因此,foo 不需要 return 语句。PHP 知道 terminate() 之后的代码是不可达的。这有助于避免冗余代码。
never 在类方法中
此示例演示了类方法中的 never。
<?php declare(strict_types=1); class Auth { public function checkAccess(): never { if (!$this->isAuthenticated()) { header('Location: /login'); exit(); } } private function isAuthenticated(): bool { return false; } } $auth = new Auth(); $auth->checkAccess(); echo "Access granted";
checkAccess
方法在未通过身份验证时重定向。当身份验证失败时,它从不返回。never 类型记录了这种行为。这对于安全检查很有用。
最佳实践
- 文档: 清楚地记录 never 函数的行为。
- 异常: 尽可能选择抛出异常而不是 exit()。
- 静态分析: 使用 never 帮助工具检测不可达代码。
- 过度使用: 避免将 never 用于可能返回的函数。
- 可读性: 使用 never 使终止行为显式。
来源
本教程通过实际示例介绍了 PHP never 返回类型,展示了它在各种场景中的用法,从错误处理到无限循环。
作者
列出 所有 PHP 教程。