static return 输入 PHP 7 个接口
static return type in PHP 7 interfaces
为什么在 PHP 7 中不能声明具有 static
return 类型的接口?
假设我有以下 类:
interface BigNumber {
/**
* @param BigNumber $that
*
* @return static
*/
public function plus(BigNumber $that);
}
class BigInteger implements BigNumber { ... }
class BigDecimal implements BigNumber { ... }
我想强制plus()
方法的return类型为static
,即:
BigInteger::plus()
必须return一个BigInteger
BigDecimal::plus()
必须return一个BigDecimal
我可以通过以下方式声明接口:
public function plus(BigNumber $that) : BigNumber;
但这并不能强制执行上述内容。我想做的是:
public function plus(BigNumber $that) : static;
但是 PHP 7,到目前为止,对此并不满意:
PHP Parse error: syntax error, unexpected 'static' (T_STATIC)
这是否有特定原因,或者这是一个应该报告的错误?
这不是错误,只是从面向对象编程的角度来看在设计方面没有意义。
如果您的 BigInteger
和 BigDecimal
都实现了 BigNumber
,您就会关心他们履行的合同。我这种情况,它是 BigNumber
的界面。
所以您应该在接口中使用的 return 类型是 BigNumber
因为针对该接口进行编码的任何人除了该接口的成员之外什么都不知道。如果您需要知道哪个是 returned,首先界面可能太宽了。
注意:具有泛型的编程语言可以通过将return类型指定为泛型类型来实现此效果,但PHP没有泛型和可能近期不会有。
2020 年更新
静态 return 类型 have been introduced in PHP 8.
为什么在 PHP 7 中不能声明具有 static
return 类型的接口?
假设我有以下 类:
interface BigNumber {
/**
* @param BigNumber $that
*
* @return static
*/
public function plus(BigNumber $that);
}
class BigInteger implements BigNumber { ... }
class BigDecimal implements BigNumber { ... }
我想强制plus()
方法的return类型为static
,即:
BigInteger::plus()
必须return一个BigInteger
BigDecimal::plus()
必须return一个BigDecimal
我可以通过以下方式声明接口:
public function plus(BigNumber $that) : BigNumber;
但这并不能强制执行上述内容。我想做的是:
public function plus(BigNumber $that) : static;
但是 PHP 7,到目前为止,对此并不满意:
PHP Parse error: syntax error, unexpected 'static' (T_STATIC)
这是否有特定原因,或者这是一个应该报告的错误?
这不是错误,只是从面向对象编程的角度来看在设计方面没有意义。
如果您的 BigInteger
和 BigDecimal
都实现了 BigNumber
,您就会关心他们履行的合同。我这种情况,它是 BigNumber
的界面。
所以您应该在接口中使用的 return 类型是 BigNumber
因为针对该接口进行编码的任何人除了该接口的成员之外什么都不知道。如果您需要知道哪个是 returned,首先界面可能太宽了。
注意:具有泛型的编程语言可以通过将return类型指定为泛型类型来实现此效果,但PHP没有泛型和可能近期不会有。
2020 年更新
静态 return 类型 have been introduced in PHP 8.