Переопределить родительский метод интерфейса, использующий подсказку типа

Скажем, у моего босса есть класс и интерфейс:

class HisBar {}

interface HisFooInterface
{
    public function doSomethingWithBar(HisBar $bar);
}

и у меня есть собственный класс, который может расширять или не расширять HisBar

class MyBar extends HisBar {}

Я хотел бы сделать это:

interface MyFooInterface extends HisFooInterface
{
    public function doSomethingWithBar(MyBar $bar);
}

Но да, я получаю ошибку:

Неустранимая ошибка: объявление MyFooInterface::doSomethingWithBar() должно быть совместимо с HisFooInterface::doSomethingWithBar(HisBar $bar) в path\to\MyFooInterface.php в строке xx

Я имею в виду, что мне нужно использовать экземпляр интерфейса, но с другой подсказкой типа, это вообще возможно? Есть какой-либо способ сделать это ? Как изменить тип аргумента? Спасибо.


person egig    schedule 18.10.2013    source источник
comment
См. здесь: stackoverflow.com/questions/4567020/   -  person Jay Nebhwani    schedule 18.10.2013
comment
Нет, вы меняете метод, делая его более явным, что нарушает контракт HisFooInterface. Теоретически вы могли бы просто принять stdClass или вообще не использовать подсказку типа, но это противоречит цели.   -  person George Brighton    schedule 18.10.2013
comment
comment
@GeorgeBrighton, кстати, я сделал это с no type hint at all, но все равно. То есть я ничего не могу сделать с таким интерфейсом? подсказка типа делает интерфейс негибким/неизменяемым?   -  person egig    schedule 18.10.2013
comment
Если вы переопределяете допустимые типы в дочернем интерфейсе, вы нарушаете то, что вы объявили в родительском интерфейсе. Это просто логическая проблема, на которую PHP указывает здесь. Проблема не в негибкости PHP, а в том, что вы совершаете логическую ошибку и не видите ее. Чтобы решить эту проблему, вам придется полностью переопределить наследование.   -  person deceze♦    schedule 18.10.2013
comment
@egg Два интерфейса, каждый из которых содержит одно и то же определение функции, вполне допустимы. Можете ли вы опубликовать то, что вы пробовали, что не сработало? Подсказка типов делает интерфейсы негибкими, но именно в этом ее цель — заставить PHP жаловаться, если вы попытаетесь дать методу то, чего он не ожидает.   -  person George Brighton    schedule 18.10.2013