这是为什么声明不兼容?(Why is this declaration not compatible

2019-10-18 09:02发布

总之我有

abstract class AbstractMapper implements MapperInterface {

    public function fetch(EntityInterface $entity, Array $conditions = array()) {
        . . .
    }

}

interface MapperInterface {

    public function fetch(EntityInterface $entity, Array $conditions = array());

}

abstract class AbstractUserMapper extends AbstractMapper implements UserMapperInterface {

    public function fetch(UserInterface $user, Array $conditions = array()) {

        $conditions = array_merge($conditions, array('type' => $user->getType()));

        return parent::fetch($user, $conditions);
    }

}

interface UserMapperInterface {

    public function fetch(UserInterface $user, Array $conditions = array());

}

这是我的错误:

致命错误:型号\ DATA \映射器的宣言\ AbstractUserMapper :: fetch()方法必须与型号\ DATA \映射器\接口\ MapperInterface的::获取兼容()

如果我改变UserInterfaceEntityInterface它的工作原理,但它只是似乎是错误的,并在我的AbstractUserMapper::fetch()当我输入$user我的IDE只显示在我的声明的方法EntityInterfacegetType()不在该列表。

我知道我还可以把$user->getType()因为我知道我有对象实现UserInterface但是这一切似乎只是错误的,甚至我的IDE是这样认为的还是我失去了一些东西?

为什么这个不行? 它是搞乱我的代码,如果我必须把EntityInterface代替' UserInterface我想。

Answer 1:

问题就出在这里:

abstract class AbstractUserMapper 
  extends AbstractMapper 
  implements UserMapperInterface 

作为第一步骤,检查的定义AbstractMapper

abstract class AbstractMapper 
  implements MapperInterface

父母和孩子之间的类接口的定义是可传递的,所以我们可以合并的第一个定义:

abstract class AbstractUserMapper 
  extends AbstractMapper 
  implements UserMapperInterface, MapperInterface

这意味着你的类需要实现:

public function fetch(EntityInterface $entity, Array $conditions = array());

public function fetch(UserInterface $user, Array $conditions = array());

这是不可能的,因为方法的重载不存在PHP。

可能的解决方法

假设下面的接口定义:

interface EntityInterface {}
interface UserInterface extends EntityInterface {}

我建议删除该implements UserMapperInterface

abstract class AbstractUserMapper extends AbstractMapper


文章来源: Why is this declaration not compatible?
标签: php oop