Interfețe în OOP în PHP
După cum știți deja, clasele abstracte reprezintă un set de metode pentru descendenții lor. O parte dintre aceste metode pot fi implementate în clasa în sine, iar o parte dintre metode pot fi declarate abstracte și pot necesita implementare în clasele derivate.
Să ne imaginăm o situație în care clasa voastră abstractă reprezintă doar un set de metode abstracte publice, fără a adăuga metode cu implementare.
De fapt, clasa părinte descrie interfața descendenților, adică setul metodelor lor publice, obligatorii pentru implementare.
De ce avem nevoie de asta: pentru a face mai puține greșeli în programare - descriind toate metodele necesare în clasa-părinte, putem fi siguri că toți descendenții le vor implementa cu adevărat.
Când ajută acest lucru: să presupunem că creăm clasa noastră-părinte și câțiva descendenți ai ei. Dacă după un timp, de exemplu, după o lună, decidem să creăm încă un descendent, cu siguranță vom uita detaliile codului nostru și s-ar putea să uităm să scriem implementarea unei metode în noul descendent. Cu toate acestea, PHP însuși nu va permite pierderea metodei - și va afișa pur și simplu o eroare.
Același lucru este valabil și pentru un alt programator, care lucrează la proiectul tău. Să presupunem că codul clasei-părinte l-ai scris tu, iar apoi colegul tău a decis să creeze încă un descendent. Nici colegul tău nu va reuși să piardă câteva metode.
Există, totuși, o problemă: de fapt, am făcut clasa noastră-părinte pentru a scrie în ea metode abstracte publice, dar noi înșine sau colegul nostru avem posibilitatea să adaugăm accidental în această clasă o metodă non-publică sau non-abstractă.
Să presupunem că vrem să interzicem fizic în părinte alte metode, decât cele abstracte publice. În PHP, pentru aceasta, în loc de clase abstracte, se pot folosi interfețe.
Interfețele reprezintă clase ale căror toate metodele sunt publice și nu au implementare. Codul metodelor trebuie implementat de clasele-descendenți ale interfețelor.
Interfețele se declară la fel ca și clasele
obișnuite, dar folosind cuvântul cheie interface
în loc de cuvântul class.
Pentru moștenirea de la interfețe se folosește
o terminologie ușor diferită: se spune că
clasele nu moștenesc de la interfețe, ci implementează
le. În consecință, în loc de cuvântul extends
se folosește cuvântul cheie
implements.
Nu se poate crea un obiect al interfeței. Toate metodele
interfeței trebuie declarate ca public
și nu trebuie să aibă implementare. Interfața
poate avea doar metode, nu și proprietăți.
De asemenea, nu se poate face o interfață
și o clasă cu același nume.