PHP 7:多函数返回类型

时间:2017-07-23 03:22:31

标签: php php-7

所以,现在我们得到了新的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

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

4 个答案:

答案 0 :(得分:7)

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

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

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

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

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

  • 可能存在合法的情况,其中返回不同类型实际上是最好的事情。如果是这样:一切都好。但这就是使用松散类型语言的好处:只是不要指定函数的返回类型。但是......那说......情况可能不是合法的,所以首先要通过前面的设计考虑来确定你是否真的有这些真正的边缘情况,其中返回不同的类型是必要的。

答案 1 :(得分:5)

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

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

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

类型,而不是类型。

答案 2 :(得分:1)

自2020年开始更新。

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

要在PHP中具有多种返回类型,您只需要具有PHP 8,否则根本不可能实现。但是,您不应傻傻地将所有内容都设置为可能的返回值,因为这可能会使您的代码变得一团糟。 @Adam Cameron在他的answer中很好地解释了这一点。

答案 3 :(得分:0)

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

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

答案:

不可能。通过PHP本身没有任何方法。

但是,您可以省略仅用于严格 键入的“类型声明”。例如,仅使用DocBlocks @return bool|string。 IDE可以识别它,但是PHP不在乎。

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