1

要するに、私は持っています

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() の宣言と互換性がある必要があります

を に変更するUserInterfaceEntityInterface動作しますが、間違っているように見えます。また、AbstractUserMapper::fetch()入力すると$user、IDE は myEntityInterfaceで宣言されたメソッドのみを表示getType()し、そのリストにはありません。

$user->getType()実装しているオブジェクトを知っているので、まだ配置できることはわかっていますUserInterfaceが、すべてが間違っているように見えます.IDEでさえそう考えているか、ここに何かが欠けていますか?

これが機能しないのはなぜですか?EntityInterface' I think UserInterface.

4

1 に答える 1

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
于 2013-07-16T07:53:12.390 に答える