Интерфејси у ООП у PHP
Као што већ знате, апстрактне класе представљају скуп метода за своје потомке. Део ових метода може бити имплементиран у самој класи, а део метода може бити декларисан апстрактним и захтевати имплементацију у изведеним класама.
Замислимо ситуацију када ваша апстрактна класа представља само скуп апстрактних јавних метода, не додајући методе са имплементацијом.
Заправо ваша родитељска класа описује интерфејс потомака, односно скуп њихових јавних метода, обавезних за имплементацију.
Зашто нам то треба: да бисмо приликом програмирања правили мање грешака - описавши све потребне методе у класи-родитељу, можемо бити сигурни у то да сви потомци их заиста имплементирају.
Када ће ово помоћи: рецимо да креирамо нашу класу-родитеља и неколико потомака уз њу. Ако потом после неког времена, на пример, месец дана, одлучимо да креирамо још једног потомка, сигурно ћемо већ заборавити детаље нашег кода и сасвим можемо заборавити да напишемо имплементацију неког метода у новом потомку. Међутим, сам PHP неће дозволити да се метод изгуби - и једноставно ће пријавити грешку.
Исто важи и за другог програмера, који ради на вашем пројекту. Рецимо да сте код класе-родитеља писали ви, а затим ваш колега одлучи да креира још једног потомка. Ни ваш колега неће моћи да изгуби пар метода.
Постоји, међутим, проблем: заправо смо направили нашу класу-родитеља зато да бисмо писали у њој апстрактне јавне методе, али ми сами или наш колега имамо могућност случајно да додамо у ову класу нејавни метод или неапстрактни.
Рецимо да желимо физички да забранимо прављење у родитељу других метода, осим апстрактних јавних. У PHP за то уместо апстрактних класа можемо користити интерфејсе.
Интерфејси представљају класе код којих су сви методи јавни и који немају имплементацију. Код метода морају имплементирати класе-потомци интерфејса.
Интерфејси се декларишу на исти начин као и обичне
класе, али користећи кључну реч interface
уместо речи class.
За наслеђивање од интерфејса користи се
мало другачија терминологија: каже се да
класе не наслеђују од интерфејса, већ их имплементирају.
Сходно томе уместо речи extends
треба користити кључну реч
implements.
Не може се креирати објекат интерфејса. Сви методи
интерфејса морају бити декларисани као public
и не смеју имати имплементацију. Интерфејс
може имати само методе, али не и својства.
Такође се не може направити интерфејс и класа са
истим именом.