首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在PHP8.1中永远不返回类型的内容

在PHP8.1中永远不返回类型的内容
EN

Stack Overflow用户
提问于 2021-07-26 12:13:16
回答 2查看 2.1K关注 0票数 17

PHP8.1引入了never返回类型,它是什么?nevervoid的区别是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-07-26 12:13:16

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

代码语言:javascript
复制
function redirect(string $uri): never 
{
    header('Location: ' . $uri);
    exit();
}

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

( return 1)它没有显式定义语句.

代码语言:javascript
复制
function redirect(string $uri): never 
{
    exit();
    return 'something';
}

将提示:

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

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

代码语言:javascript
复制
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).
  • Both不允许返回值。
  • 都不能用作参数或属性类型。
  • 都不能用作箭头的返回类型,function.
  • Both只能用作独立类型(不允许合并或交叉)。

什么时候选择void而不是never,反之亦然?

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

票数 19
EN

Stack Overflow用户

发布于 2021-11-11 15:13:58

使用never (PHP8.1),您可以保护一个函数,因为它永远不会返回,例如,如果您想确保创建的一个无穷无尽的循环(从调用站点的角度来看),那么:

代码语言:javascript
复制
<?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 (因为您只能使用voidnever)。

代码语言:javascript
复制
<?php

function back_from_eternity(string $forEternity): void
{
    usleep(100000); // not so long

    return $forEternity
}

$echo = back_from_eternity('soon');

允许PHP防止回声从永恒中返回,读者也可以发现$echo = (以及随后使用该变量所做的一切)仍然需要通常的维护/调试/测试或开发。

Void as return type

  • 比较

这两种方法都有它们在被违反时抛出的好处,因此程序永远不会按原样继续运行,并使函数调用返回无效(所有双关语都是有意的)。

调用该函数的任何副作用仍应考虑。通常都是关于他们的。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68529614

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档