Intereting Posts
(mysql, php) Как получить значение поля auto_increment перед вставкой данных? Динамически рассчитать цену продукта на основе значений настраиваемых полей при добавлении в корзину Добавление div ниже изображений в colorbox php game, формула для вычисления уровня на основе exp Code Igniter – лучшее место для объявления глобальной переменной paypal parameater для создания повторяющегося профиля дает ошибку, пожалуйста, помогите мне Любая инфраструктура для PHP, эффективная как Django для Python? Почему каждый раз, когда я использую scandir (), я получаю периоды в начале массива? Только показать кнопку для входа в систему в Laravel Изменение порядка записей с передней стороны Вывод текста между двумя словами Обнаруживать онлайн-пользователей? PHPUnit – «Никаких тестов не выполняется» при использовании файла конфигурации Передача нескольких переменных в представление? два внешних ключа, как составить карту с красноречивым ларавелем

Невозможно реализовать два интерфейса, которые имеют одно и то же имя метода

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

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 не может быть уверен, какой интерфейс имеет тот метод, который вы хотите. В вашем случае они идентичны, но представьте, если у них были разные параметры.

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