PHP类实现接口,其中方法类型提示接口获取兼容性错误

时间:2017-03-17 21:50:25

标签: php oop

我收到一个错误,对我来说很奇怪,但也许我做错了或误解了这些是如何工作的。我尝试使用谷歌搜索并查看类似的问题,但它们似乎都没有相同,所以这就是我现在所处的位置。

概述:我有一个模型即服务,它实现了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,只是为了澄清。我知道这不是这样的接口,但我不明白为什么这应该工作所以也许有人可以帮助我。希望这里有足够的信息可以帮助我哈哈。

谢谢!

2 个答案:

答案 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,对我来说似乎不那么具有描述性,但那没关系。