⊗ppOpIfInr 65 of 107 menu

Интерфейси в ООП в PHP

Както вече знаете, абстрактните класове представляват набор от методи за своите наследници. Част от тези методи може да бъдат реализирани в самия клас, а част от методите може да бъдат декларирани като абстрактни и да изискват реализация в дъщерните класове.

Представете си ситуация, в която вашият абстрактен клас представлява само набор от абстрактни публични методи, без да добавя методи с реализация.

Всъщност вашият родителски клас описва интерфейс на наследниците, тоест набор от техните публични методи, задължителни за реализация.

Защо ни е нужно това: за да правим по-малко грешки при програмирането - като опишем всички необходими методи в родителския клас, можем да сме сигурни, че всички наследници наистина ще ги реализират.

Кога ще помогне това: да кажем, че създадем нашия родителски клас и няколко наследника към него. Ако след известно време, например, след месец, решим да създадем още един наследник, със сигурност ще забравим детайлите на нашия код и вероятно можем да забравим да напишем реализацията на някой метод в новия наследник. Однако самият PHP няма да позволи методът да се изгуби - и просто ще даде грешка.

Същото важи и за друг програмист, който работи с вашия проект. Да кажем, че кода на родителския клас сте го писали вие, а след това вашият колега реши да създаде още един наследник. На вашия колега също няма да му се получи да изпусне няколко метода.

Има, обаче, проблем: всъщност ние направихме нашия родителски клас за да пишем в него абстрактни публични методи, но ние самите или нашият колега имаме възможност случайно да добавим в този клас не публичен метод или не абстрактен.

Да кажем, че искаме физически да забраним в родителя правенето на други методи, освен абстрактни публични. В PHP за това вместо абстрактни класове могат да се използват интерфейси.

Интерфейсите представляват класове, при които всички методи са публични и нямат реализация. Кодът на методите трябва да бъде реализиран от класове-наследници на интерфейсите.

Интерфейсите се декларират по същия начин, както обикновените класове, но се използва ключовата дума interface вместо думата class.

За наследяване от интерфейси се използва малко по-различна терминология: казва се, че класовете не наследяват от интерфейси, а ги реализират. Съответно вместо думата extends трябва да се използва ключовата дума implements.

Не може да се създаде обект от интерфейс. Всички методи на интерфейса трябва да бъдат декларирани като public и не трябва да имат реализация. Интерфейсът може да има само методи, но не и свойства. Не може също така да се направи интерфейс и клас с едно и също име.

Български
AfrikaansAzərbaycanবাংলাБеларускаяČeštinaDanskDeutschΕλληνικάEnglishEspañolEestiSuomiFrançaisहिन्दीMagyarՀայերենIndonesiaItaliano日本語ქართულიҚазақ한국어КыргызчаLietuviųLatviešuМакедонскиMelayuမြန်မာNederlandsNorskPolskiPortuguêsRomânăРусскийසිංහලSlovenčinaSlovenščinaShqipСрпскиSrpskiSvenskaKiswahiliТоҷикӣไทยTürkmenTürkçeЎзбекOʻzbekTiếng Việt
Ние използваме бисквитки за работата на сайта, анализ и персонализация. Обработката на данни се извършва в съответствие с Политика за поверителност.
приемам всички настройки отхвърляне