Wroce do przykladu z ksiazki. Masz jakis mechanizm do otwierania i zamykania. I tak sobie zamykasz i otwierasz jakas klasa otwieraczem.
Otworzyc mozna: worek, plecak, sloik, drzwi.
Worek i sloik a takze reszta nie maja raczej nic wspolnego (no moze worek z plecakiem ale nie o to chodzi), wiec nie mozna zastosowac dziedziczenia bo niby co dziedziczyc ? Z trugiej strony chcesz miec pewnosc ze jak bedziesz uzywac klasy otwieracza to napewno przekazane do niego obiekty beda mialy metody otworz i zamknij. Stad zamiast tworzyc cztery klasy otieracze ktore przyjmuja argumenty na zasadzie addItem1(Worek $worek), addItem2(Plecak $plecak), to tworzysz jedna, ktora w argumencie przyjmuje klasy ktore implementuja interfejs otwierania np. AddItem(Otwieralne $objekt). I teraz masz pewnosci ze niewazne co przekazesz do otwieracza (pod warunkiem ze implementuje wskazany interfejs tu Otwieralne), mozesz wywolac metody zamknij i otworz. Krotki przyklad.
Przypuscmy ze otwieracz jest mala kolekcja zeczy do zamkniecia.
<?php
$otwieracz = New Otwieracz()
$otwieracz->addItem(New Plecak());
$otwieracz->addItem(New Slowik());
$otwieracz->closeAll();
?>
Teraz dodales do otwieracza trzy instancje klas implementujacych interfejs otwieralne. Mozesz wiec wywolac metode closeAll() ktora iterujac przez obiekty ktore dodales zamknie je wszystkie. Dlaczego taj jest ? Bo w deklaracji metody addItem klasy otwieracz pokazales jaki tym obiektu mozesz przekazac, czyli addItem(Otwieralne $objekt). Jesli sprobujesz inny to zglosi to blad, bo innego przekazac nie mozna. Sens jest tego taki, ze klasy nie musza po sobie dziedziczyc a ty i tak masz pewnosc ze mozesz uzywac na nich metod ktore musza implementowac bo taknakazuje interfejs.
Mam nadzieje ze nie pomotalem Ci za bardzo
Po co wszystko wymuszac. Nikt nie mowi ze wszystko, no ale wymuszac to po to po co opisalem wyzej, zeby miec pewnosc ze klasy mozna uzyc w miejscach w ktorych sie chce i nic sie nie wysypie. I po co wszyscy maja sie zapoznawac z kazda klasa w projekcie ? Trzeba by bylo analizowac jej kod i stwoerdzic ze nadaje sie do tego zeby jej obiekt przekazac do otwieracza, lepiej zeby wiedzieli ze implementuje ona(badz nie) interfejs otwieralne, wtedy bez zadnej praktycznie wiedzy, i bez znajomosci metody Otworz() Zamknij() wiedza ze moga ta klase przekazac do Otwieracza. Przeciez taki koder micro%^& nie zna kazdego zakamarka kodu Windowsa

1. To ze klasa implementuje interfejs
nie oznacza ze nie moze miec innych metod.
2. Tak, jesli zaimplementujesz metode i dodasz do niej final, znaczy to ze nie moze byc ona przeciazona w klasach dziedziczacych. Slowo abstract jak najbardziej oznacza ze ta metode trzeba zaimplementowac w klasie dziedziczacej.
3. Co do metody statycznej. Wyobrazmy sobie cos takiego. Na poczatku skryptu tworzydsz instancje obiektu WebRequest ktory trzyma wszystkie POST GET COOKIE itp i pozwala operowac na nich tak czy inaczej. Teraz zapominasz o WebRequest, tworzysz jakas inna klase ktora gdzies tam w srodku uzywa zmiennych GET/POST czy cos tam. Po co korzystac z nich bezposrednio skoro klasa WebRequest zapewnia nam jakies metody do operacji na nich, i teraz co ? Musimy uzyc klasy WebRequest, tworzymy nowa instancje i uzywamy ? No ale po co ? Przeciez w skrypcie wystarczy nam tylko jedna instancja klasy WebRequest. I co z tym fantem zrobic ? Ano tutaj przychodzi nam na pomoc metoda statyczna. Jako ze nie wiesz czy w momencie w ktorym chcesz sie odwolac do metod WebRequest instancja tej klasy jest juz utworzona czy nie w klasie WebRequest implementujesz statyczna metode getInstance(). Przyklad.
<?php
class WebRequest {
private static $Instance = false;
public static function getInstance
() { if(!self::Instance) {
self::Instance = New WebRequest();
}
return self::Instance;
}
}
?>
W ten sposob jesli musimy sie odwolac do metod WebRequest a wiemy ze nie potrzebujemy wiecej niz jednej jej instancji robimy $objekt = WebRequest::getInstance(); w ten sposob jesli instancja WebRequest nie zostala jeszcze utworzona zostanie utworzona, jesli istnieje zostanie zwrocona istniejaca. To jest wzorzec Singleton, dojdziesz do tego w Twojej ksiazce w rozdziale Warstwa Absrakcji dla bazy danych. Od razu mowie zebys nie wierzyl slepo w te przyklady tam bo sa fatalne. Ten sterownik dla PEAR DB to sciema

Jakbym pomotal Ci za bardzo to krzycz

Jest sobota rano kaca mam