PHP8.1引入了never返回类型,它是什么?never和void的区别是什么?
发布于 2021-07-26 12:13:16
引入的never类型声明用作函数的返回类型提示,这些函数既没有隐式也没有显式的return语句。必须通过抛出异常或使用exit/die函数退出终止。
function redirect(string $uri): never
{
header('Location: ' . $uri);
exit();
}在这里,redirect被称为永不返回的函数,因为:
( return 1)它没有显式定义语句.
function redirect(string $uri): never
{
exit();
return 'something';
}将提示:
PHP致命错误:永不返回的函数不能返回
2)它没有隐式定义的return 语句.。
function redirect(string $uri): never
{
if (false) {
header('Location: ' . $uri);
exit();
}
}由于这里的条件从未满足,所以执行跳过返回隐式NULL的if语句,这将导致:
PHP致命错误: Uncaught : redirect():永不返回函数不能隐式返回
3)它以一个exit 函数来结束它的执行
虚空与永不
void可以让return;但是never can't.never强制函数抛出或终止于退出/死,但void确实是PHP类型系统中每种其他类型的子类型,包含空(这允许返回类型covariance).什么时候选择void而不是never,反之亦然?
当您期望PHP在函数调用之后执行下一个语句时,您应该声明一个函数返回类型void。当您不期望PHP在函数调用之后执行下一个语句时,您应该声明它为never。
发布于 2021-11-11 15:13:58
使用never (PHP8.1),您可以保护一个函数,因为它永远不会返回,例如,如果您想确保创建的一个无穷无尽的循环(从调用站点的角度来看),那么:
<?php
function eternity(string $forEternity): never
{
start:
usleep(1000);
goto start;
}
eternity('the future');
// <- we are here only after the next big-bang, not in this current universe.这段代码非常简单,通常忘记这里的goto语句会触发错误.
无穷无尽的循环通常也不需要保护(通常我们不希望它们发生),但是never对于函数die()、exit()或throw总是有用的。
同样,尽管在标准控制流中不推荐使用这三种方法来保留函数(前两种方法甚至在某些SAPI中控制运行过程)。但是最后(不是双关语),可以让IDE和工具看到函数永远不会从代码中编码的返回类型信息中返回。这也包括正在使用这些工具或正在阅读代码的人。
使用void (PHP7.1),您可以保证函数永远不会返回类型,包括底部类型的never (因为您只能使用void或never)。
<?php
function back_from_eternity(string $forEternity): void
{
usleep(100000); // not so long
return $forEternity
}
$echo = back_from_eternity('soon');允许PHP防止回声从永恒中返回,读者也可以发现$echo = (以及随后使用该变量所做的一切)仍然需要通常的维护/调试/测试或开发。
这两种方法都有它们在被违反时抛出的好处,因此程序永远不会按原样继续运行,并使函数调用返回无效(所有双关语都是有意的)。
调用该函数的任何副作用仍应考虑。通常都是关于他们的。
https://stackoverflow.com/questions/68529614
复制相似问题