Невозможно реализовать два интерфейса с одинаковым именем метода. - PullRequest
5 голосов
/ 31 марта 2011

Это не работает:

interface TestInterface
{
    public function testMethod();
}

interface TestInterface2
{
    public function testMethod();
}

class TestClass implements TestInterface, TestInterface2
{

}

дает мне ошибку:

Неустранимая ошибка: невозможно наследовать абстрактную функцию TestInterface2 :: testMethod () (ранее объявленный в абстрактном TestInterface).

Это правильно? Почему это не разрешено? Не имеет смысла для меня.

Это также происходит с абстрактными функциями, например, если вы реализуете интерфейс, а затем наследуете от класса, который имеет абстрактную функцию с тем же именем.

Ответы [ 5 ]

11 голосов
/ 11 июля 2013

Похоже, что текущие версии PHP действительно могут это сделать. Я отслеживал изменения в поведении вплоть до этого коммита:

https://github.com/php/php-src/commit/31ef559712dae57046b6377f07634ad57f9d88cf#Zend/zend_compile.c

Таким образом, с php-5.3.9 задокументированное поведение изменилось.

9 голосов
/ 31 марта 2011

В руководстве по PHP явно сказано:

До версии PHP 5.3.9 класс не мог реализовать два интерфейса, которые указывали метод с одинаковым именем, посколькувызвать двусмысленность.Более поздние версии PHP позволяют это, если дубликаты методов имеют одинаковую сигнатуру.

7 голосов
/ 31 марта 2011

Нет смысла реализовывать два интерфейса, содержащие методы с одинаковыми сигнатурами.

Компилятор не может знать, действительно ли методы имеют одну и ту же цель - если нет, это будет означать, что хотя бы один из интерфейсов не может быть реализован вашим классом.

Пример:

interface IProgram { function execute($what); /* executes the given program */ }
interface ISQLQuery { function execute($what); /* executes the given sql query */ }

class PureAwesomeness implements IProgram, ISQLQuery {
    public function execute($what) { /* execute something.. but what?! */ }
}

Итак, как вы видите, невозможно реализовать метод для обоих интерфейсов - и это такженевозможно вызвать метод, который фактически реализует метод из данного интерфейса.

4 голосов
/ 10 апреля 2011
interface BaseInterface
{
    public function testMethod();
}

interface TestInterface extends BaseInterface
{
}

interface TestInterface2 extends BaseInterface
{
}

class TestClass implements TestInterface, TestInterface2
{
    public function testMethod()
    {
    }
}
0 голосов
/ 31 марта 2011

Это недопустимо, потому что PHP не может быть уверен, какой интерфейс имеет нужный метод.В вашем случае они идентичны, но представьте, если у них разные параметры.

Вам следует пересмотреть дизайн своего приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...