总之我有
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只会显示声明的方法我的EntityInterface
和getType()
不在该列表中。
我知道我仍然可以放$user->getType()
,因为我知道我已经实现了UserInterface
的对象,但这一切似乎都错了,即使我的IDE认为是这样,或者我在这里遗漏了什么?
为什么这不起作用?如果我必须放EntityInterface
而不是'UserInterface
,我的代码就会搞乱。
答案 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