首页 > 解决方案 > PHP 8.1 中从不返回的类型

问题描述

PHP 8.1 引入了never返回类型,它是什么?never和和有什么区别void

标签: phpreturn-typephp-8.1

解决方案


never引入类型声明以用作函数的返回类型提示,这些函数从不具有return既不是隐式也不是显式的语句。并且必须通过抛出异常或使用exit/die函数退出来终止。

function redirect(string $uri): never 
{
    header('Location: ' . $uri);
    exit();
}

这里redirect称为永不返回函数,因为:

1) 它没有return明确定义的语句。

function redirect(string $uri): never 
{
    exit();
    return 'something';
}

将产生:

PHP致命错误:一个永不返回的函数不能返回

2) 它没有return隐式定义的语句。

function redirect(string $uri): never
{
    if (false) {
        header('Location: ' . $uri);
        exit();
    }
}

由于这里的条件永远不会满足,因此执行会跳过返回隐式的 if 语句,NULL这将导致:

PHP致命错误:未捕获的TypeError:redirect():永不返回的函数不能隐式返回

exit3)它以一个函数结束它的执行

无效vs从不

  • void可以有return;never不能。
  • never强制函数抛出或以 exit/die 终止,但void不会。
  • never是 PHP 类型系统中所有其他类型的子类型,包括 void(这允许返回类型协变)。
  • 两者都不允许返回值。
  • 两者都不能用作参数或属性类型。
  • 两者都不能用作箭头函数的返回类型。
  • 两者都只能用作独立类型(不允许联合或交集)。

何时选择voidnever反之亦然?

void当您希望 PHP 在函数调用之后执行下一条语句时,您应该声明一个函数返回类型。never当您不希望 PHP 在该函数调用之后执行下一条语句时,您应该声明它。


推荐阅读