Ben*_*min 15 php interface php-7
为什么在PHP 7中无法声明具有static
返回类型的接口?
假设我有以下课程:
interface BigNumber {
/**
* @param BigNumber $that
*
* @return static
*/
public function plus(BigNumber $that);
}
class BigInteger implements BigNumber { ... }
class BigDecimal implements BigNumber { ... }
Run Code Online (Sandbox Code Playgroud)
我想执行的返回类型plus()
的方法static
,那就是:
BigInteger::plus()
必须退货 BigInteger
BigDecimal::plus()
必须退货 BigDecimal
我可以通过以下方式声明接口:
public function plus(BigNumber $that) : BigNumber;
Run Code Online (Sandbox Code Playgroud)
但这并没有强制执行上述规定.我想做的是:
public function plus(BigNumber $that) : static;
Run Code Online (Sandbox Code Playgroud)
但到目前为止,PHP 7并不满意:
PHP解析错误:语法错误,意外'静态'(T_STATIC)
是否有特定原因,或者这是一个应该报告的错误?
这不是一个错误,从面向对象的编程角度看它在设计上没有意义.
如果您BigInteger
同时BigDecimal
执行这两项工作BigNumber
,您就会关心他们履行的合同.我是这个例子,它BigNumber
是界面.
因此,您应该在界面中使用的返回类型是BigNumber
因为对该接口进行编码的任何人都不知道除该接口的成员之外的任何其他内容.如果您需要知道返回哪一个,那么界面可能太宽了.
注意:使用泛型的编程语言可以通过将返回类型指定为泛型类型来实现此效果,但PHP不具有泛型,并且可能在不久的将来不具有泛型.