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).