2013-10-02 3 views
7

У меня есть интерфейс:PHP - Интерфейс наследования - декларация должна быть совместима

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

И классы:

class ActiveRecordBase 
{ 
    ... 
} 

class Product extends ActiveRecordBase 
{ 
    ... 
} 

========

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

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

или это:

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

я получил ошибку «декларация должна быть совместима»

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

+1

Я знаю, это был вывешен несколько лет тому назад, но вот мои два cents- сообщения Этой ошибки не делать с наследованием интерфейсов. Эта ошибка объясняется тем, что PHP не поддерживает истинную перегрузку функции/метода, как на других языках (например, Java, C++), к которым вы, вероятно, привыкли. – anotheruser1488182

ответ

10

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

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

if (!($object instanceof Product)) { 
    throw new InvalidArgumentException; 
} 
+0

, но я попытаюсь создать другой интерфейс, основываясь на этом. Не реализовать, но наследовать с ограничением. – violarium

+0

Не важно, расширяете ли вы или реализуете. Вы не можете изменить объявление интерфейса, период. Вы не можете сказать, что Foo реализует Bar, когда реализация Bar намного более ограничена, чем указано Foo. – deceze

-3
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()); 
Смежные вопросы