为什么这个声明不兼容?

时间:2013-07-15 19:46:43

标签: php oop

总之我有

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());

}

这是我得到的错误:

致命错误:Model \ Data \ Mappers \ AbstractUserMapper :: fetch()声明必须与Model \ Data \ Mappers \ Interfaces \ MapperInterface :: fetch()

的声明兼容

如果我将UserInterface更改为EntityInterface它可以正常工作,但它似乎是错误的,而且当我键入AbstractUserMapper::fetch()时,我的$user我的IDE只会显示声明的方法我的EntityInterfacegetType()不在该列表中。

我知道我仍然可以放$user->getType(),因为我知道我已经实现了UserInterface的对象,但这一切似乎都错了,即使我的IDE认为是这样,或者我在这里遗漏了什么?

为什么这不起作用?如果我必须放EntityInterface而不是'UserInterface,我的代码就会搞乱。

1 个答案:

答案 0 :(得分:3)

问题在于:

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