Это не работает:
interface TestInterface { public function testMethod(); } interface TestInterface2 { public function testMethod(); } class TestClass implements TestInterface, TestInterface2 { }
Дает мне ошибку:
Неустранимая ошибка: не удается наследовать абстрактную функцию TestInterface2 :: testMethod () (ранее объявленная абстракция в TestInterface).
Это верно? Почему это не разрешено? Не имеет смысла для меня.
Это также происходит с абстрактными функциями, например, если вы реализуете интерфейс и затем наследуете от класса с абстрактной функцией с тем же именем.
Нет смысла реализовывать два интерфейса, содержащие методы с теми же сигнатурами.
Компилятор не может знать, действительно ли методы имеют одну и ту же цель – если нет, это означает, что по крайней мере один из интерфейсов не может быть реализован вашим классом.
Пример:
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?! */ } }
Итак, как вы видите, невозможно реализовать метод для обоих интерфейсов – и было бы невозможно вызвать метод, который фактически реализует метод из данного интерфейса.
Похоже, что текущие версии PHP на самом деле могут это сделать. Я отслеживал изменение в поведении до этой фиксации:
https://github.com/php/php-src/commit/31ef559712dae57046b6377f07634ad57f9d88cf#Zend/zend_compile.c
Итак, как и в php-5.3.9, документальное поведение, похоже, изменилось.
В руководстве PHP прямо сказано:
До PHP 5.3.9 класс не мог реализовать два интерфейса, которые указывали метод с тем же именем, поскольку это вызывало бы двусмысленность. Более поздние версии PHP позволяют это до тех пор, пока дублирующие методы имеют одну и ту же подпись.
interface BaseInterface { public function testMethod(); } interface TestInterface extends BaseInterface { } interface TestInterface2 extends BaseInterface { } class TestClass implements TestInterface, TestInterface2 { public function testMethod() { } }
Это недопустимо, потому что PHP не может быть уверен, какой интерфейс имеет тот метод, который вы хотите. В вашем случае они идентичны, но представьте, если у них были разные параметры.
Вы должны пересмотреть свой дизайн приложения.