首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP 7接口中的静态返回类型

PHP 7接口中的静态返回类型
EN

Stack Overflow用户
提问于 2015-06-20 10:21:21
回答 2查看 7.9K关注 0票数 23

为什么在PHP7中不能用static返回类型声明接口?

假设我有以下课程:

代码语言:javascript
复制
interface BigNumber {
    /**
     * @param BigNumber $that
     *
     * @return static
     */
    public function plus(BigNumber $that);
}

class BigInteger implements BigNumber { ... }
class BigDecimal implements BigNumber { ... }

我希望将plus()方法的返回类型强制执行到static,即:

  • BigInteger::plus()必须返回一个BigInteger
  • BigDecimal::plus()必须返回一个BigDecimal

我可以以下列方式声明接口:

代码语言:javascript
复制
public function plus(BigNumber $that) : BigNumber;

但这并不能强制执行上述规定。我想做的是:

代码语言:javascript
复制
public function plus(BigNumber $that) : static;

但到目前为止,PHP 7对它并不满意:

Parse :语法错误,意外的“静态”(T_STATIC)

这有什么特别的原因吗?还是这是一个应该报告的错误?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-01-31 13:49:59

2020年更新

PHP8中的静态返回类型已被引进

票数 16
EN

Stack Overflow用户

发布于 2015-06-20 10:26:34

这不是一个bug,只是从面向对象编程的角度来看,它在设计上没有意义。

如果您的BigIntegerBigDecimal都实现了BigNumber,那么您将关心它们所履行的合同。我这个案子,是BigNumber的接口。

因此,您应该在接口中使用的返回类型是BigNumber,因为任何针对该接口进行编码的人只知道该接口的成员。如果您需要知道返回哪个接口,那么首先接口可能太宽了。

注意:使用泛型编程语言可以通过将返回类型指定为泛型类型来实现这一效果,但是PHP没有泛型,而且在不久的将来也可能没有泛型。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30952876

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档