Interfejsy

Czym jest interfejs?

Jest to zbiór nazw operacji(metod), które są pozbawione implementacji.
Może również posiadać stałe.
Wszystkie metody zawarte w interfejsie muszą być PUBLICZNE oraz muszą zostać nadpisane w klasach pochodnych.
Oznacza to, że nasz plik, będzie zawierał tylko i wyłącznie nazwy metod i przekazywane argumenty,
bez żadnej logiki. Do danej klasy możemy implementować dowolną ilość interfejsów.
Interfejsy mogą dziedziczyć inne interfejsy , natomiast nie mogą dziedziczyć oraz implementować klas.

Najprostszym sposobem będzie wytłumaczenie działania tego na przykładzie mediów społecznościowych.
Załóżmy że chcemy pobierać statystyki / zautomatyzować nasze działania w social mediach.
Żeby to zrobić, w każdym miejscu musimy się w jakieś sposób zalogować / połączyć.

 interface SocialMedia
 {
     public function Connect();
     public function GetReport($dateFrom, $dateTo);
 } 
 
 class Facebook implements SocialMedia 
 {
     public function Connect() {
       // do facebooka możemy logować się za pomocą loginu,
          hasła oraz dodatkowego zabezpieczenia (kod sms).
     }
 
     public function GetReport($dateFrom, $dateTo) {
       // raport na podstawie lajków, ilości odwiedzin, danych terorytiorialnych
     }
 
 }
 
 class Instagram implements SocialMedia 
 {
     public function Connect() {
       // tutaj wykorzystujemy logowanie po Api, więc jest to zupełnie inny sposób. 
     } 
 
     public function GetReport($dateFrom, $dateTo) {
       // raport na podstawie odtworzeń filmów, serduszek i komentarzy
     }
 
 }
 
 class Pinterest implements SocialMedia 
 {
     public function Connect() {
       // tutaj może to być jeszcze inny sposób, poza tą klasą nie obchodzi nas jak 
          to będzie wyglądać, ważne że w każdy z tych przypadków, nie będziemy
          przekazywać żadnych parametrów i logowanie 
          będzie wyglądało tak samo(wywołanie metody Connect(), bez parametrów). 
     } 
 
     public function GetReport($dateFrom, $dateTo) {
       // raport na podstawie polubień udostępnianych zdjęć
     }
 
 }

W efekcie końcowym, nie interesuje nas w jaki sposób są sporządzane raporty, logowanie.

Mamy 100% pewność, że w celu uzyskania oczekiwanego efektu, w przypadku logowania musimy

wywołać Connect() bez parametrów,
a w przypadku pobrania raportu, musimy przekazać 2 parametry:

GetReport($dateFrom, $dateTo).

Podsumowując:
Interfejs określa nam metody, które potrzebujemy do uzyskania jakiegoś efektu, ale nie opisuje sposobu, w jaki to wykonamy.

Dlaczego powstały interfejsy skoro mamy klasę abstrakcyjną?

W PHP nie możemy dziedziczyć po wielu  klasach, natomiast możemy implementować wiele interfejsów.
Pozwalaja nam one również zaprojektować wygląd klasy bez zerowej implementacji a także chronią nas przed pomyłkami,
(jeżeli implementujemy dany interfejs, mamy pewność, że klasa będzie miała zawarte w nim metody).

Dodaj komentarz