PHP – Наследование интерфейса – декларация должна быть совместимой

У меня есть интерфейс:

interface AbstractMapper { public function objectToArray(ActiveRecordBase $object); } 

И классы:

 class ActiveRecordBase { ... } class Product extends ActiveRecordBase { ... } 

========

Но я не могу этого сделать:

 interface ExactMapper implements AbstractMapper { public function objectToArray(Product $object); } 

или это:

 interface ExactMapper extends AbstractMapper { public function objectToArray(Product $object); } 

У меня ошибка « объявление должно быть совместимо »

Итак, есть ли способ сделать это в PHP?

Related of "PHP – Наследование интерфейса – декларация должна быть совместимой"

Нет, интерфейс должен быть точно реализован. Если вы ограничиваете реализацию более конкретным подклассом, это не тот же интерфейс / подпись. У PHP нет дженериков или подобных механизмов.

Конечно, вы всегда можете проверить код вручную:

 if (!($object instanceof Product)) { throw new InvalidArgumentException; } 
 interface iInvokable { function __invoke($arg = null); } interface iResponder extends iInvokable { /** Bind next responder */ function then(iInvokable $responder); } class Responder implements iResponder { function __invoke($arg = null) { // TODO: Implement __invoke() method. } /** Bind next responder */ function then(iInvokable $responder) { // TODO: Implement then() method. } } class OtherResponder implements iResponder { function __invoke($arg = null) { // TODO: Implement __invoke() method. } /** Bind next responder */ function then(iInvokable $responder) { // TODO: Implement then() method. } } class Invokable implements iInvokable { function __invoke($arg = null) { // TODO: Implement __invoke() method. } } $responder = new Responder(); $responder->then(new OtherResponder()); $responder->then(new Invokable());