php - PHP 8.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致命错误:未捕获的TypeError:redirect():永不返回的函数不能隐式返回
exit
3)它以一个函数结束它的执行
无效vs从不
void
可以有return;
但never
不能。never
强制函数抛出或以 exit/die 终止,但void
不会。never
是 PHP 类型系统中所有其他类型的子类型,包括 void(这允许返回类型协变)。- 两者都不允许返回值。
- 两者都不能用作参数或属性类型。
- 两者都不能用作箭头函数的返回类型。
- 两者都只能用作独立类型(不允许联合或交集)。
何时选择void
,never
反之亦然?
void
当您希望 PHP 在函数调用之后执行下一条语句时,您应该声明一个函数返回类型。never
当您不希望 PHP 在该函数调用之后执行下一条语句时,您应该声明它。
推荐阅读
- javascript - 使用浏览器控制台 (Chrome) 将表格数据从 HTML 页面导出到 CSV 文件
- node.js - NodeJs 护照验证
- postgresql - 具有已删除属性的历史表的累积计数
- angular - Angular:订阅的返回结果
- javascript - 如何以角度访问 DOM 元素
- laravel - Laravel 结合 Vuejs,2 路由 1 路由
- file - 提供上传的多媒体内容的最佳方式
- angularjs - 如何在头部注入 ng-bind
- c# - C# 应用程序在哪里查找程序中使用的数据源/数据库表
- javascript - 使用 jQuery 在搜索输入上添加/删除 CSS 类