PHP8.1中的永不返回类型是什么
PHP 8.1 引入了never返回类型,它是什么?是什么样的区别never和void?
回答
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 致命错误:未捕获的类型错误:重定向():永不返回的函数不得隐式返回
3)它以一个exit函数结束它的执行
无效vs从不
void可以有return;但never不能。never强制函数抛出或以 exit/die 终止,但void不会。never是 PHP 类型系统中所有其他类型的子类型,包括 void(这允许返回类型协变)。- 两者都不允许返回值。
- 两者都不能用作参数或属性类型。
- 两者都不能用作箭头函数的返回类型。
- 两者都只能用作独立类型(不允许并集或交集)。
当选择void了never,反之亦然?
void当您期望 PHP 在函数调用后执行下一条语句时,您应该声明一个函数返回类型。并且您应该never在不期望 PHP 在该函数调用之后执行下一条语句时声明它。