php - Why is this declaration not compatible? -


in short have

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

this error get:

fatal error: declaration of model\data\mappers\abstractusermapper::fetch() must compatible of model\data\mappers\interfaces\mapperinterface::fetch()

if change userinterface entityinterface works seems wrong , in abstractusermapper::fetch() when type$user ide shows methods declared in entityinterface , gettype() not in list.

i know can still put $user->gettype() because know object have implements userinterface seems wrong, ide thinks or missing here?

why not work? messing code if have put entityinterface instead of 'userinterface think.

the problem lies here:

abstract class abstractusermapper    extends abstractmapper    implements usermapperinterface  

as first step, inspect definition of abstractmapper:

abstract class abstractmapper    implements mapperinterface 

interface definitions between parent , child classes transitive, can merge first definition:

abstract class abstractusermapper    extends abstractmapper    implements usermapperinterface, mapperinterface 

this means class needs implement:

public function fetch(entityinterface $entity, array $conditions = array());  public function fetch(userinterface $user, array $conditions = array()); 

and not possible, because method overloading doesn't exist in php.

possible solution

assuming following interface definitions:

interface entityinterface {} interface userinterface extends entityinterface {} 

i suggest drop implements usermapperinterface:

abstract class abstractusermapper extends abstractmapper 

Comments