我收到一个错误,对我来说很奇怪,但也许我做错了或误解了这些是如何工作的。我尝试使用谷歌搜索并查看类似的问题,但它们似乎都没有相同,所以这就是我现在所处的位置。
概述:我有一个模型即服务,它实现了int main();
void p2() {
char t = ((char*)&main)[0];
printf("%x\n", t);
}
。 QueryableServiceProvider
是一个接口,其方法QueryableServiceProvider
提示类型提示single()
接口作为参数。然后回到我的模型作为服务,我有一个QueryStruct
方法,类型提示single()
类。 SingleStruct
类实现SingleStruct
接口。但是,当我尝试运行它时,我收到错误:
ModelServiceProvider :: single的声明(SingleStruct $ parameters):模型必须兼容 QueryableServiceProvider :: single(QueryStruct $ parameters)in ModelServiceProvider.php
现在对于某些代码来说,这会有点混乱,因为有5个不同的类:
QueryableServiceProvider.php
QueryStruct
QueryStruct.php
interface QueryableServiceProvider {
public function single(QueryStruct $parameters);
}
SingleStruct.php
interface QueryStruct {
/** Stuff Here **/
}
Model.php
class SingleStruct implements QueryStruct {
/** Stuff Here **/
}
ModelServiceProvider.php
class Model {
/** Model bits here **/
}
我使用的是PHP 7.1,只是为了澄清。我知道这不是这样的接口,但我不明白为什么这应该工作所以也许有人可以帮助我。希望这里有足够的信息可以帮助我哈哈。
谢谢!
答案 0 :(得分:0)
您已为single
的{{1}}方法指定了返回类型,但它不符合针对{{1}的方法签名的相似性原则ModelServiceProvider
接口中的方法签名。
single
中的 QueryableServiceProvider
签名:
single
QueryableServiceProvider
中的 public function single(QueryStruct $parameters);
签名:
single
你应该通过在界面中指定返回类型(如下所示)来使它们完全相同:
ModelServiceProvider
或在课堂方法中省略(以这种方式):
public function single(SingleStruct $parameters): Model {}
感谢@Kenyon关于在应用上一个修补程序时测试结果的通知,问题的第二个解决方法是在参数声明中保持完全相同的类型提示接口和接口之间实现者类 As stated here,虽然您可以将参数传递给只需要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
}
}
答案 1 :(得分:-1)
嗯,根据这个,Php type hinting not getting along with interfaces and abstract classes?
PHP故意这样做。我真的不明白为什么,因为你通常可以输入提示界面,只要你作为一个程序员正确使用接口(即需要你正在使用的东西),然后逻辑上它就是#&好的。
但是,我想这是故意以这种方式工作,所以我只是改变了我的代码:/ Bummer,对我来说似乎不那么具有描述性,但那没关系。