У меня есть интерфейс:
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?
Нет, интерфейс должен быть точно реализован. Если вы ограничиваете реализацию более конкретным подклассом, это не тот же интерфейс / подпись. У 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());