PHP 永不返回类型

wen PHP项目 2

本文目录导读:

PHP 永不返回类型

  1. 基本概念
  2. 语法与用法
  3. 关键特性
  4. 实际应用场景
  5. 静态分析优势
  6. 注意事项
  7. 版本兼容

在 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("用户数据无效");
}

注意事项

  1. 不能与 一起使用?never 是无效的
  2. 不能作为参数类型function foo(never $x) 不允许
  3. 属性不能使用:类属性不能用 never 类型
  4. 无法显式返回:函数体内不能有 return; 语句

版本兼容

  • PHP 8.1+:支持 never 类型
  • PHP 7.x 及更早版本:不支持,需要避免使用
// PHP 8.1 实现
function exitApp(): never { ... }
// PHP 7.4 替代方案(无强制类型)
function exitApp(): void {
    exit;
}

never 类型特别适合用于异常抛出函数、断言函数、中断流程的控制函数等场景,它能让其他开发人员和静态分析工具清楚地理解函数的语义。

抱歉,评论功能暂时关闭!