【问题标题】:PHP 7: Multiple function return typesPHP 7:多种函数返回类型
【发布时间】:2017-07-23 03:22:31
【问题描述】:

所以,现在我们有了新的 PHP7,我们可以检查返回类型是否是我们想要的。

例如,

function foo(): bool
{
    $num = 8;
    if (10 === $num) {
        return true;
    } else {
        return false;
    }
}
foo();

输出:false

好吧,这很容易吗?它按原样工作,但如果返回不是我们所期望的?

function bar(): bool
{
    $num = 10;
    if (10 === $num) {
        return array(['apple', 'banana', 'strawberry']);
    } else {
        return false;
    }
}
bar();

输出:Uncaught TypeError: Return value of foo() must be of the type boolean, array returned

这是非常基本的,这些例子只是展示了它是如何工作的。

如果我们有代码示例 2 中的函数,我们可以检查多个返回类型吗?喜欢

function bar(): bool || array    <---
{
    $num = 10;
    if (10 === $num) {
        return array(['apple', 'banana', 'strawberry']);
    } else {
        return false;
    }
}
bar();

但是这个结果:FATAL ERROR syntax error, unexpected '||' (T_BOOLEAN_OR), expecting '{' on line number 2

那么可以定义多种返回类型吗?

【问题讨论】:

  • 如果您有多种返回类型,那么类型提示的意义何在?据我所知,它不是语言功能,实现起来似乎也没什么用。如果您需要多种返回类型,请不要尝试输入提示。如果您需要指定有错误但想输入提示,throwException 或使用可为空的类型提示和 return null
  • 您描述的功能前段时间被拒绝:wiki.php.net/rfc/union_types

标签: php php-7


【解决方案1】:

@scott-c-wilson 已经很好地解释了语言规则的机制。

从设计的角度来看,具有可能返回不同类型结果的函数表明存在潜在的设计缺陷:

  • 如果您要返回结果,否则 false 如果某些事情没有按计划进行;您可能应该抛出异常。如果功能处理没有按计划进行;这是一个特殊的情况:利用事实。我知道 PHP 本身有一个习惯,如果事情不起作用,则返回 false,但这只是表明 PHP 设计不佳 - 出于同样的原因。

  • 如果您的函数返回可能不同的东西,那么它很可能在做不止一件事,这是您的函数设计不佳。函数应该做一件事。如果你的函数有一个 if/else 和 true/false 块来处理不同的处理块(而不是仅仅处理退出情况),那么这可能表明你应该有两个函数,而不是一个。让调用代码决定使用哪个。

  • 如果您的函数返回两个不同的对象类型,然后可以在调用代码中以类似的方式使用它们(即:调用代码中没有 if this: do that; else do this other thing),这可能表明您应该返回一个接口,而不是具体的实现。

  • 在某些合法的情况下,返回不同的类型实际上是最好的做法。如果是这样:一切都很好。但这就是使用松散类型语言的好处所在:只是不要指定函数的返回类型。但是......也就是说......这种情况可能合法,因此首先要考虑前面的设计考虑,以确定您是否真的有这些真正的极端情况之一,其中返回不同类型是保证。

【讨论】:

    【解决方案2】:

    是否可以定义多种返回类型?

    没有。这才是重点!多种返回类型令人困惑,意味着您需要进行额外的非直观检查(我在看着您,“===”)。

    来自the manual: “...返回类型声明指定将从函数返回的值的 type。” (强调我的)

    类型,而不是类型。

    【讨论】:

      【解决方案3】:

      从 2020 年开始更新。

      已对联合类型进行了投票,并被 PHP 8 接受。 https://wiki.php.net/rfc/union_types_v2

      要在 PHP 中拥有多种返回类型,您只需要拥有 PHP 8,否则根本不可能。但是,您不应该愚蠢并将一切都设置为可能的返回,因为它可能会使您的代码变得一团糟。 @Adam Cameron 在他的 answer 中很好地解释了这一点。

      【讨论】:

        【解决方案4】:

        Union types 应该存在,但它们不存在。

        例如,您可以使用?int,但随后会使用NULLINT

        答案:

        这是不可能的。没有任何方法可以通过 PHP 本地化。

        但是,您可以省略“类型声明”,该声明仅适用于 strict typing。例如,只需使用 DocBlocks @return bool|string。 IDE 会识别它,但 PHP 不会在意。

        http://docs.phpdoc.org/references/phpdoc/tags/return.html

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-08-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-09-09
          • 1970-01-01
          • 2021-04-13
          相关资源
          最近更新 更多