Hej @IAmBoskiM widze, że jestes w dość podobnej sytuacji co ja

Tyle, że ja już zrozumiałem co to są interfejsy/abstrakcje i po co

Generalnie masz bardzo dużo racji: one są niemal niepotrzebne w starszych wersjach PHP. W najnowszej 7.0 już jest lepiej ale nadal niedoskonale. Ich znaczenie zrozumiałem dopiero gdy poczytałem kilka książek o programowaniu gdzie opisane są jezyki naprawdę obiektowe
W dobrym języku obiektowym deklarujac jakas funkcje lub metode mozna wymusic by podany argument byl danego typu: byl daną klasą lub implementowal dany interfejs lub rozszerzal daną klase abstrakcyjną.
Spojrz na ten kod:
class pan_domu {
public function nakarm_zwierze_miesozerne($zwierze) {
$jedzenie = new Mieso();
$zwierze->je($jedzenie);
}
public function nakarm_zwierze_roslinozerne($zwierze) {
$jedzenie = new Salata();
$zwierze->je($jedzenie);
}
}
Wiec jest sobie jakis czlowiek, pan domu, ktory moze karmic swoje zwierzeta.
I teraz kod ktory uzyjemy do karmienia zwierzecia (kota):
$zwierze = new Kot();
$pan = new pan_domu();
$pan_domu->nakarm_zwierze_miesozerne($zwierze);
Wszystko jest pieknie, ale nie masz zadnej kontroli nad tym czy zwierze, ktore probujesz nakarmic je mięso.
OK, wlasnie sobie myslisz: jak to nie maz? Przeciez widze wyraznie co napisalem. Utworzylem kota z jakiejs tam klasy i go karmie miesem.
To jest zupelna prawda pod warunkiem, ze to ty jestes autorem klasy Kot(), ktorej specjalnie tu nie napisalem i wewntarz tego kota sa napisales metode je(), ktora wywoluje metode gryzie(), potem trawi() i dokladniej trawi_mieso() (zakladamy ze zwierz. roslinozerne beda mialy zamiast tego trawi_rosliny()) i tak dalej.
Jednak w warunkach naturalnych nad kodem pracuje sie w wiele osob. To ktos inny dostarczy klase Kot. Mozesz oczywiscie przejrzec jak ta klasa w srodku wyglada i jesli cos jest nie tak odeslac ten kod do wspolpracownika by go poprawil. Ale jesli pracujecie nad funkcją obslugującą Zoo zajmie ci to wieki zanim przejrzysz tak wszystkie zwierzeta, prawda?
I teraz pojawia sie polsrodek w postaci interfejsu. Tworzysz interfejs Zwierzeta_Miesozerne w ktorym definiujesz co taki zwierzak musi umiec:
interface Zwierzeta_Miesozerne {
public function je();
private function gryzie();
private function trawi();
private function trawi_mieso();
}
I pieknie. teraz tylko mowisz wszystkim wspolracownikom, twórcom zwierząt by ich zwierzeta implementowaly ten interfejs.
Zaczynasz juz lapac? Czekaj, to jeszcze nie wszystko

oczywiscie nadal musisz przegladac dostarczony kod czy on implementuje ten interfejs, prawda? O wiele mniej roboty, ale nadal jest robota.
Tu z pomocą przychodzi ostatnia wlasciwosc takich kontrukcji: wymuszanie typu parametrow. Przepisz swoj kod z samego poczatku mojego wyjasnienia tak by linijka:
public function nakarm_zwierze_miesozerne($zwierze) {
wygladala:
public function nakarm_zwierze_miesozerne( Zwierzeta_Miesozerne $zwierze) {
Takie cos wymusza by przekazane zwierze implementowalo dany interfejs. Jesli tak nie bedzie, PHP zwroci blad typu i po prostu calosc nie bedzie dzialac. Zatem juz nie musisz kodu przegladac: jesli programista cie nie poslucha, kod zwyczajnie nie bedzie dzialac.
Podsumowujac: tak jak ci to wyzej napisano, interfejsy i abstrakcje to jest rodzaj "umowy" w kodzie, umowy miedzy programistami tworzącymi różne fragmenty kodu, umowy dzieki ktorej zaden programista nie musi zagladac do srodka kodu stworzonego przez innego programiste.