PHP7接口中的静态返回类型
为什么在PHP7中不能声明一个带有PHP7接口中的静态返回类型,php,interface,php-7,Php,Interface,Php 7,为什么在PHP7中不能声明一个带有static返回类型的接口 假设我有以下课程: 接口BigNumber{ /** *@param BigNumber$那个 * *@返回静态 */ 公共功能增强版(BigNumber$that); } 类BigInteger实现BigNumber{…} 类BigDecimal实现BigNumber{…} 我想将plus()方法的返回类型强制为static,即: biginger::plus()必须返回一个biginger BigDecimal::plus()
static
返回类型的接口
假设我有以下课程:
接口BigNumber{
/**
*@param BigNumber$那个
*
*@返回静态
*/
公共功能增强版(BigNumber$that);
}
类BigInteger实现BigNumber{…}
类BigDecimal实现BigNumber{…}
我想将plus()
方法的返回类型强制为static
,即:
必须返回一个biginger::plus()
biginger
必须返回一个BigDecimal::plus()
BigDecimal
public function plus(bigname$that):bigname;
但这并不强制执行上述规定。我想做的是:
public function plus(bigname$that):静态;
但迄今为止,PHP7对此并不满意:
PHP分析错误:语法错误,意外的“静态”(T_static)
这有什么特别的原因,或者这是一个应该报告的错误吗?这不是一个错误,只是从面向对象编程的角度来看,它在设计方面没有意义 如果您的
BigInteger
和BigDecimal
同时实现了BigNumber
,那么您关心他们履行的合同。在这种情况下,它是BigNumber
的接口
因此,您应该在接口中使用的返回类型是BigNumber
,因为任何对该接口进行编码的人都只知道该接口的成员。如果您需要知道返回的是哪一个,那么首先接口可能太宽了
注意:使用泛型的编程语言可以通过将返回类型指定为泛型类型来实现这一效果,但是PHP没有泛型,并且在不久的将来可能不会有泛型。2020更新
PHP 8中的静态返回类型。我的想法是在输入上要灵活(例如,您可以将
biginger
与BigDecimal
进行比较),但在输出上要严格(对类调用的任何方法都应该返回同一类的实例)。也许这并不完全有意义,但至少PHPdoc允许这种用法(@returnstatic
)!PHPDoc实际上不知道任何关于static
,最接近的是self
,在这种情况下,它与接口返回类型提示相同。奇怪的是,这个:实际上记录了static
:“使用该值的类的一个对象,如果继承它将表示子类。(请参阅PHP手册中的后期静态绑定)。”最初,我认为作为返回类型,self
与指定完整的类名有细微的不同——我认为这是一种契约,用于返回您正在访问的类的完全相同的实例。然而,在类型声明的上下文中,self
似乎只是完整类名的简写这似乎是一个不幸的设计决策,因为在方法体的上下文中,self
是对类本身的引用。我至少可以找到一个“合法”用法-我正在创建抽象模型类,我有find函数。如果说有UserModel驱动AbstractModel,我就在AbstractModel中找到了逻辑。这个逻辑是d现在,我不仅希望UserModel::find()返回UserModel的实例,还需要一些UserModel定义的详细信息。这样,就没有逻辑方法可以让UserModel::find()return PostModel,其中包含另一个抽象静态函数,该函数为适当的表配置抽象模型。类型不变性,这就是为什么。实现/重写方法必须与PHP中的类型完全匹配;static
显然不匹配,因为它引用当前上下文,因此不能不变性。