是否可以在 PHP 7 上指定多个返回类型?

2022-08-30 08:17:15

我有一些方法可以返回两种返回类型之一。我正在使用一个利用MCV的框架,所以重构这几个函数特别有吸引力。

是否可以声明返回类型返回一个或另一个,但在其他任何内容上失败?

function test(): ?
{
    if ($this->condition === false) {
        return FailObject;
    }

    return SucceedObject;
}

答案 1

从 PHP 8+ 开始,您可以使用并集类型

function test(): FailObject|SuccessObject {}

另一种方法是,自 PHP 4 以来的所有版本中都可用,方法是让两个对象共享一个接口。例:

interface ReturnInterface {}
class FailObject implements ReturnInterface {}
class SuccessObject implements ReturnInterface {}
function test(): ReturnInterface {}

在此示例中,为空。它的存在本身就支持所需的返回类型声明。ReturnInterface

您还可以使用基本类,可能是抽象类。


对我来说,对于这个用例,接口比联合类型更清晰,更具可扩展性。例如,如果我以后想要一个,我只需要将其定义为扩展 - 而不是遍历所有签名并将其更新为。WarnObjectReturnInterfaceFailObject|SuccessObject|WarnObject


答案 2

正如bishop所指出的,有一个RFC用于添加多个返回类型。但是,我想我会补充一点,从PHP7.1开始,您现在可以指定一个可为空的返回类型,如下所示:

function exampleFunction(string $input) : ?int
{
    // Do something
}

因此,此函数将采用字符串,并在int之前添加问号,从而允许它返回null或整数。

以下是文档的链接:http://php.net/manual/en/functions.returning-values.php

下面引用了该页面的一段话来解释用法:PHP 7.1 允许在类型声明前面加上 ?— (例如函数 canReturnNullorString(): ?string)

另外,这是另一个与此相关的线程:PHP7中的可空返回类型


推荐