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

新手上路,请多包涵

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

是否可以声明返回类型返回一个或另一个并在其他任何事情上失败?

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

    return SucceedObject;
}

原文由 myol 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 844
2 个回答

自 PHP 8+ 起,您可以使用 联合类型

 function test(): FailObject|SuccessObject {}

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

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

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

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


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

原文由 bishop 发布,翻译遵循 CC BY-SA 4.0 许可协议

从 PHP 8.0 开始 ,这是可能的

您现在可以使用联合类型来指定:

 function test(): Success|Failure
{
    if ($this->condition === false) {
        return new Failure();
    }

    return new Success();
}

这是可能的事实 并不意味着它总是可取 的。在许多(可能是大多数)情况下,使用接口(例如 ResultFailureFailure 仍然可以实现),如在不同的答案中建议的那样,更可取。

但在其他情况下,联合类型可能对弱类型的替代方案有意义。 Eg a method that accepts both string and int , or to describe the return type of a function like stripos() , which returns int|false .

原文由 yivi 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏