Recimo jedan konkretan i praktican primer - Placanje na sajtu.
Imas deo koji se na primer obraca procesing serveru za pocetak sesije, rezultat vraca neki session ID koji ti trebas da cuvas negde i koristis prilikom slanja payment podataka. Onda imas metode (kazi ga operacije) gde ti trebas poslati opis proizvoda (dimenzije, opis, tezina, kolicina...), cenu, detalje o kartici, billing info (10 podataka), shipping info (10 podataka). Sad shipping info i tezinu treba poslati i shipping servisu koji ce ti izracunati koliko ce te iznositi DHL usluga recimo, i to Over Night Delivery. Kako bi to izgledalo bez oop, pa pises jedan po jedan deo redom, i sve to u kodu koji vrsi placanje. Onda klijent kaze, super je Shop, ali ja hocu da mogu da naplatim i membership na sajtu, znaci nema ga proizvod, nema shipping, nema pola infoa od gore, ok, ti to iskopiras sve u users modul, sredis, i naplacujes membership.. a onda, naravno, klijent kaze: super je ovo, ali ovo radi samo sa karticama, ja hocu i paypal da dodam kao procesor za kartice. I posle ti kaze, aj sad sve to prebaci u DEMO mod, da mogu da testiram a da mi ne skida pare, a tu se recimo koristi drugi url koji kontaktiras za sesiju. I onda nastaju problemi, jer ti sve imas linearno u kodu.
Sad resenje, oop pristup naravno.
Napravis klasu za Authorize.net procesor, onda napravis klasu za paypal procesor, i napravis svoju klasu koja extenduje jednu od te dve, dinamicki, zavisi sta je selektovao krajnji korisnik. I ti u kodu imas liniju:
$myPaymentHandler->connect(); - gde ce tvoja klasa koja je nasledila bilokoju od ovde 2 (50 ako treba) da tacno zna sta treba da uradi, jer njena mother klasa ima definisane metode. Sama ce u sebi da setuje Session Id (ukoliko ga koristi, ako ne, nista se ne desava, tebe to u operativnom sloju ne zanima sta ce koja klasa da uradi, na tebi je da pozoves to za svaki slucaj, ili stavis u konstruktor da se samo pozove) onda ti napravis za svaku klasu metodu koja kaze:
$myPaymentHandler->setBilling($mojNizSaPodacima); - opet ista prica, ti imas uniformni niz, formatiran kako tebi odgovara, a svaka klasa ima drugacije formatiran zahtev, ali tebe to ne zanima, to ce svaka klasa sebi da resi.
Onda kazes ->setShipping($nizSaShippingInfo); - skontao si sablon vec
na kraju kazes ->setCCInfo($nizSaCCInfo);
i na kraju kazes ->process();
Onda svaka klasa zna sta treba da radi, kako da handluje rezultate, gde da smesti greske koje je dobila, kako da parsira te greske, koje flegove da setuje za slucaj greske uopste itd....
Ti posle samo pitas
if($myPaymentHandler->error_exists){
$error_info = $myPaymentHandler->human_readable_error;
}
i to ispises na sajtu gde je potrebno. Peace a cake

Slican primer mozes koristiti za razne oblasti, recimo pravis klasu koja salje SMS, bilo preko clickatela, bilo preko nekog drugog servisa. Klasa za parsiranje .csv fajlova, samo par metoda pozoves, ne zanima te sta se ispod dogadja i koji se princip obrade koristi. Klasa koja crta mape, oces gmaps, oces yahoo, oces bing, ti samo setujes par metoda sa dimenzijama, lokacijama i markerima, metoda za search, ne zanima te koja klasa gde salje requests i odakle dobija rezultate.
A posle, ako treba prosiriti ili izmeniti nesto, ti imas to samo na jednom mestu da uradis, veoma praktican metod rada.