PHP 7:多函数返回类型

Nik*_*911 2 php php-7

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

例如,

function foo(): bool
{
    $num = 8;
    if (10 === $num) {
        return true;
    } else {
        return false;
    }
}
foo();
Run Code Online (Sandbox Code Playgroud)

OUTPUT: false

哦,这很容易吗?它的工作原理应该如此,但如果回报不是我们所期望的?

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

OUTPUT: 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();
Run Code Online (Sandbox Code Playgroud)

但是这会导致: FATAL ERROR syntax error, unexpected '||' (T_BOOLEAN_OR), expecting '{' on line number 2

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

Ada*_*ron 9

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

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

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

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

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

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


Nik*_*911 6

截至 2020 年更新此内容。

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

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


Sco*_*son 5

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

不,那就是重点!多种返回类型令人困惑,意味着您需要进行额外的非直观检查(我在看着你,"===").

手册:"...返回类型声明指定将从函数返回的值的类型." (强调我的)

类型,而不是类型.