Interfejsi u OOP u PHP-u
Kao što već znate, apstraktne klase predstavljaju skup metoda za svoje potomke. Deo ovih metoda može biti implementiran u samoj klasi, a deo metoda može biti deklarisan apstraktnim i zahtevati implementaciju u izvedenim klasama.
Zamislimo situaciju kada vaša apstraktna klasa predstavlja samo skup apstraktnih javnih metoda, bez dodavanja metoda sa implementacijom.
Zapravo, vaša roditeljska klasa opisuje interfejs potomaka, odnosno skup njihovih javnih metoda, obaveznih za implementaciju.
Zašto nam je ovo potrebno: da bismo prilikom programiranja pravili manje grešaka - opisavši sve neophodne metode u roditeljskoj klasi, možemo biti sigurni u to da će ih svi potomci zaista implementirati.
Kada će ovo pomoći: recimo da kreiramo našu roditeljsku klasu i nekoliko potomaka za nju. Ako kasnije, na primer, posle mesec dana, odlučimo da kreiramo još jednog potomka, sigurno ćemo već zaboraviti detalje našeg koda i lako možemo zaboraviti da napišemo implementaciju nekog metoda u novom potomku. Međutim, sam PHP neće dozvoliti da se metod izgubi - i jednostavno će prijaviti grešku.
Isto se odnosi na drugog programera, koji radi na vašem projektu. Neka je kod roditeljske klase napisao vi, a zatim vaš kolega odluči da kreira još jednog potomka. Vaš kolega takođe neće moći da izgubi nekoliko metoda.
Međutim, postoji problem: zapravo, napravili smo našu roditeljsku klasu da bismo u njoj pisali apstraktne javne metode, ali mi sami ili naš kolega imamo mogućnost da slučajno dodamo u ovu klasu metod koji nije javni ili nije apstraktan.
Recimo da želimo da fizički zabranimo pravljenje bilo kakvih drugih metoda u roditelju, osim apstraktnih javnih. U PHP-u, umesto apstraktnih klasa, možemo koristiti interfejse.
Interfejsi predstavljaju klase kod kojih su svi metodi javni i nemaju implementaciju. Kod metoda moraju implementirati klase koje nasleđuju (realizuju) interfejse.
Interfejsi se deklarišu na isti način kao i obične
klase, ali koristeći ključnu reč interface
umesto reči class.
Za nasleđivanje od interfejsa koristi se
malo druga terminologija: kaže se da
klase ne nasleđuju od interfejsa, već ih realizuju.
Prema tome, umesto reči extends
treba koristiti ključnu reč
implements.
Ne može se kreirati objekat interfejsa. Svi metodi
interfejsa moraju biti deklarisani kao public
i ne smeju imati implementaciju. Interfejs
može imati samo metode, ali ne i svojstva (properties).
Takođe se ne može napraviti interfejs i klasa sa
istim imenom.