【发布时间】:2015-09-06 07:21:15
【问题描述】:
为什么在 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)
这是否有特定原因,或者这是一个应该报告的错误?
【问题讨论】:
-
类型不变性,这就是原因。实现/覆盖方法必须与 PHP 中的类型完全匹配;
static没有 - 显然,因为它指的是当前上下文,因此不能保持不变。