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