22

为什么在 PHP 7 中不能声明具有static返回类型的接口?

假设我有以下课程:

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

我可以通过以下方式声明接口:

public function plus(BigNumber $that) : BigNumber;

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

public function plus(BigNumber $that) : static;

但迄今为止,PHP 7 对此并不满意:

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

是否有特定原因,或者这是一个应该报告的错误?

4

2 回答 2

16

2020 年更新

PHP 8 中引入了静态返回类型。

于 2020-01-31T13:49:59.580 回答
7

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

如果你BigIntegerBigDecimal实施两者BigNumber,你关心他们履行的合同。在这种情况下,它的BigNumber接口。

因此,您应该在接口中使用的返回类型是BigNumber因为任何针对该接口进行编码的人除了该接口的成员之外什么都不知道。如果您需要知道返回的是哪一个,则接口可能一开始就太宽了。

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

于 2015-06-20T10:26:34.310 回答