为什么在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 Parse错误:语法错误,意外'静态' (T_STATIC)
是否有特定原因,或者这是一个应该报告的错误?
答案 0 :(得分:10)
PHP 8中的静态返回类型will be introduced。
答案 1 :(得分:7)
这不是一个错误,从面向对象的编程角度来看,它在设计上没有任何意义。
如果您的BigInteger
和BigDecimal
同时实施BigNumber
,则您关心他们履行的合同。在这种情况下,它是BigNumber
的界面。
因此,您应该在界面中使用的返回类型是BigNumber
,因为对该接口编码的任何人都不知道除该接口的成员之外的任何其他内容。如果您需要知道返回哪一个,那么界面可能太宽了。
注意:使用泛型编程语言可以通过将返回类型指定为泛型类型来实现此效果,但PHP不具有泛型,并且可能在不久的将来不具备。