[英]PHP class implements interface where methods type hint interface getting compatibility errors
我得到一个对我来说很奇怪的错误,但是也许我做错了什么,或者对这些工作原理有误解。 我尝试了Googling并查看了类似的问题,但似乎没有一个是一样的,所以这就是我现在的位置。
概述:我有一个作为服务的模型,该模型实现QueryableServiceProvider
。 QueryableServiceProvider
是具有方法single()
的接口,该方法类型提示使用QueryStruct
接口作为参数。 然后回到模型作为服务,我有一个single()
方法,该类型提示SingleStruct
类。 SingleStruct
类实现QueryStruct
接口。 但是,当我尝试运行它时,出现错误:
声明ModelServiceProvider :: single(SingleStruct $ parameters):模型必须与ModelServiceProvider.php中的QueryableServiceProvider :: single(QueryStruct $ parameters)兼容
现在,对于一些代码,这将有点混乱,因为有5个不同的类:
QueryableServiceProvider.php
interface QueryableServiceProvider {
public function single(QueryStruct $parameters);
}
QueryStruct.php
interface QueryStruct {
/** Stuff Here **/
}
SingleStruct.php
class SingleStruct implements QueryStruct {
/** Stuff Here **/
}
模型.php
class Model {
/** Model bits here **/
}
ModelServiceProvider.php
class ModelServiceProvider implements QueryableServiceProvider {
public function single(SingleStruct $parameters): Model { // This is the line the error references
/** Does the query and returns an instance of Model **/
}
}
我正在使用PHP 7.1,只是为了澄清。 我知道当它不是这样的界面时,它会起作用,但是我不明白为什么这应该起作用,所以也许有人可以帮助我。 希望这里有足够的信息可以真正帮助我哈哈。
谢谢!
您已经为ModelServiceProvider
single
方法指定了返回类型 ,但它不符合QueryableServiceProvider
接口中的方法签名与single
方法签名的相似性原则。
QueryableServiceProvider
single
签名:
public function single(QueryStruct $parameters);
在ModelServiceProvider
single
签名:
public function single(SingleStruct $parameters): Model {}
您应该通过在接口中指定返回类型来使它们完全相同(如下所示):
interface QueryableServiceProvider {
public function single(QueryStruct $parameters) : Model;
}
class ModelServiceProvider implements QueryableServiceProvider {
public function single(SingleStruct $parameters): Model {
//method body
}
}
或在类的方法中省略它(这样):
interface QueryableServiceProvider {
public function single(QueryStruct $parameters) : Model;
}
class ModelServiceProvider implements QueryableServiceProvider {
public function single(SingleStruct $parameters): Model {
//method body
}
}
与感谢@肯扬对测试的应用先前修订的结果通知,第二个修复的问题是保持在接口和实施者类之间参数声明类型完全相同的提示 如这里指出 , 虽然你可以传递一个参数仅需作为参数类型instanceof
的类。
所以这必须工作:
interface QueryableServiceProvider {
public function single(QueryStruct $parameters) : Model;
}
class ModelServiceProvider implements QueryableServiceProvider {
public function single(QueryStruct $parameters): Model {
//method body
}
}
好吧,据此, Php类型暗示不与接口和抽象类相处?
PHP故意这样做。 我真的不明白为什么,因为您通常可以键入提示接口,并且只要您像程序员一样正确使用接口(即要求使用的接口),那么从逻辑上讲就可以了。
但是,我想这样做是有意的,所以我只需要更改代码即可:/ Bummer,对我的描述似乎较少,但这没关系。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.