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

2022-08-30 19:15:54

为什么在 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)

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


答案 1

2020年更新

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


答案 2

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

如果你和同时实现两者,你关心他们履行的合同。我这个案例,它是的接口。BigIntegerBigDecimalBigNumberBigNumber

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

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


推荐