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