繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM