OOP – Objektum Orientált Php
Szerző: admin | PHP | 2010 augusztus 29. 10:41

Hankó Zoltán a blog rendszeres olvasója vetette fel az objektum orientált php programozás témát, így most erről fogok írni. Köszönöm az ötletet, remélem hasznos lesz. Megpróbálom leírni, én hogyan látom a dolgokat és hogy készítek oop honlapokat.

Mi volt régen

Az objektum orientált programozásról már 8 évvel ezelőtt középsuliban tanultunk először, ahol ugyan megértettem a Teglalap.terulet() metódust, de egyszerűen nem tudtam megérteni mi értelme van objektumokat létrehozni, hisz simán is írhatnék egy területszámolós függvényt.

Egyetem alatt Java, C++ kötelezővé tette az objektumok ismeretét, származtatás, gyártófüggvények és különféle diagrammok használatát. A 4-est abból is összehoztam úgy, hogy még mindig nem láttam értelmét az egésznek.

A php oldalaimat úgy készítettem el, hogy minden kérés az index.php-be futott be, aminek a közepén volt egy content.php. Ez a paraméterben kapott ?id=profil -ból eldöntötte, hogy melyik php fájlt kell a tartalom részbe betölteni, és nagyjából ettől vált dinamikussá az egész. Ami még említésre méltó az egy config fájl, illetve egy function.php ahol az összes függvény vegyítve volt tárolva. Egy deka objektum nem volt benne.

Telekikoli.hu

Sokszor elgondolkodtam azon, miért kellene átváltanom oop-re, de valahogy sosem jöttem rá. Egyszerűen nem csináltam olyan méretű projekteket ami megkövetelte volna, mindent el tudtam végezni a jelenlegi felállásban. A telekikoli.hu oldal volt az amit hobbiból elkezdtem írni, többen használták és ilyen közösségi oldal fílinget adott. El is kezdtem írni egy cikket az újraírásáról Cakephp keretrendszer használata mellett, azonban ezt félbe kellett szakítanom két okból.

Az egyik, hogy kezdődik az egyetem és a használni szeretnék, félkész munkát pedig nem adunk ki, úgyhogy gyorsabb a régi oldalt kipucolni és felturbózni. Másrészt egy ilyen oldal elkészítése nagyon nagy munka. Nem konkrétan a programozás rész, mert az az ahol 10 nap alatt bármilyen munkát megcsinálok ha van előre konkrét rendszerterv, és grafika. Nekem az oldal szerkezetének elkészítése nagy nyűg, amiről itt írtam, és a mockingbird segítségével, vagy papíron ceruzával végzek.

Lényeg a lényeg, ha elém tesznek minden oldalról egy jpg-t én egy óra alatt átnézem és összeáll a fejemben a rendszer, esek is neki a programozásnak. De lássuk csak mit csinálok abban az egy órában:

Objektumok keresése

Ha ránézek egy oldal tervre amit photoshopban elkészítettek, előveszek egy papírt ceruzát, és elkezdem leirogatni, mik azok a nagyobb dolgok amik az oldalon találhatóak. Lényegében ez az objektum keresés, csak régen nem csináltam hozzájuk objektumokat. Zavaros igaz?

Régen egy projekt mappája úgy nézett ki, hogy gyökér könyvtár, benne css, js mappa és egy private mappa. Ide pakoltam azokat a fájlokat, amikből lényegében összeállt az oldal. Ha a telekikolin volt egy rész ahol bulira lehetett jelentkezni, akkor általában volt egy buli.php ami kezelte a kéréseket és attól függően hogy mit szerettél volna csinálni, betöltötte a buli_view.php-t vagy a buli_edit.php-t.

Aki belenézett egy ilyen mappába láthatta a kis csoportokat amik ugyanazzal az előtaggal kezdőttek és a végük mondta meg hogy konkrétan mi a feladatuk, pl apro_venne, hirek_index, kolicsere_delete. És láss csodát működött a rendszer, és nekem kb 4 másodpercig tartott lokalizálni melyik fájlba is kell belenyúlnom, annak melyik részét kell javítanom. Pusztán megszokás kérdése volt.

Persze nem volt mindig egységes elnevezés, mikor milyen időszakom volt, de mindig átláttam, ha másképp nem, végigkövettem az egészet mint egy böngésző, miket töltök be, hol minek kellene lennie. A lényeg: működött, és lehetett bővíteni.

A váltás

Az utóbbi időben kaptam pár munkát, ahol Code Igniter vagy Cakephp keretrendszert használva kellett honlapot készíteni. Ezekben az embernek nincs választása, objektum orientáltan kell programozni. Meddig tartott megtanulnom az alapokat? 2 nap, talán 3. Ez idő alatt megértettem miért érdemes használni ezeket, és hogy igazából nem is különbözik sokban attól, amit eddig én csináltam, puszán sokkal rendezettebb.

Objektumok keresése ismét

Az előbb megint elkanyarodtam az objektumoktól de térjünk vissza rájuk. Honnan tudom hogy valami objektum?

Figyelem! Amit leírok az a saját meglátásom, én így programozok. Nyilván nem vagyok a tápláléklánc csúcsán, van még rengeteg minden amit meg kell tanulnom. Az itt leírtak valószínűleg nem a legoptimálisabb megoldások és módszerek, azonban én azt mondom, hogy aki nem megy végig lépcsőfokokon és követ el hibákat, az nem is érti meg igazán, hogy az új dolog amit tanul, az miért olyan jó.

A figyelmeztetés azért is fontos, mert nem mindig azokat a dolgokat kell használni amik a legjobbak. Márkus oldalán sincs egy darab objektum, mégis ellátja a feladatát. Talán 1 órával tartott volna az egész és 8 megával lenne nagyobb, de minek dolgozni feleslegesen. Tipikus esete a bolhára lövünk ágyuval dolognak.

Honnan tudom hogy valami objektum

Kerülgetem itt a forró kását nagy kitérőkkel, de felelősségteljes dolog ez, óvatosan kell mint a szűz lánnyal. Én leülök, ránézek a képre és belegondolok hogy ha felhasználó lennék, miket csinálnék. Mik azok a dolgok amikhez adatbevitelre vagy adatbázisból való lekérésre van szükség.

Ugyanis, ha ezek megvannak, akkor már egy csomó objektumot megtaláltunk. Az abjektumok többsége metódusokat és értékeket is tartalmaznak, ezeket pedig nagyrászt adatbázis táblákból nyerik. Ha megvannak a táblák, megvannak az objektumok. Legalábbis a többségük. Nézzünk példákat:

Users

A legtöbb oldalon van bejelentkezés, felhasználói profil. Ehhez létrehozunk egy táblát mondjuk users néven. Többesszámot azért használok tábláknál, mivel felhasználókat tárol, és ennek egy sora a felhasználó.

Posts

Tegyük fel, hogy mindenki tud cikket írni, ezeket is táblában tároljuk, szintén többesszámot használva. Megint egy objektum.

Comments

A felhasználók hozzá tudnak szólni a cikkekhez, ezért egy ilyen táblánk is lesz, plusz objektum.

Posts_users

Ez mi a nyavaja? Egy cikkhez több felhasználó is hozzászólhat, és egy felhasználó több cikkhez is fűzhet hozzászólást. Ha le akarnám kérni, hogy én mihez szóltam hozzá, vagy hogy ehhez a cikkhez kik szóltak hozzá, akkor egy olyan táblára van szükségem ami ezt segíti.

Aki még nem hallott a több-többes kapcsolatról az most bajban lesz, mivel ez pont az, érdemes rágooglezni. Tehát ez a tábla tartalmaz egy felhasználó id és cikk id párost, amik összekötik a két tábla egy-egy sorát. Ennek nem fogunk létrehozni objektumot, mert felesleges. Miért felesleges? Nagyon nem gondoltam még bele, de még sosem volt szükségem rá, ezért én annak neveztem ki, az ilyeneket egyből skippelem.

Ahol nem a táblából lesz objektum

Erre egy példa a 67developer.hu oldalon lévő contact. Nem tárolok semmit adatbázisban, amit beírtok az jön nekem emailbe. Akkor minek lett belőle objektum? Nos ez a keretrendszer egyik követelménye, legalábbis én annak nevezem.

Megint kitérő jön: egy keretrendszer arra törekszik, hogy a kódot modell, controller és view részre bontsa. A kezdő oldalamon statikus tartalom van, néhány link és egy jól sikerült kép rólam /jó volt az alapanyag/. Nem kapcsolódok adatbázishoz, nincsenek benne műveletek, ezért ez egy statikus oldal, ami csak simán megjelenik.

A contact oldal ezzel szemben a megjelenítésen kívül egy email küldés feladatot is ellát. Most erre vagy létrehozok egy function.php-t ahol a különféle függvényeket tárolom, és a contact fájl elején levizsgálom hogy elküldted -e az üzenetet, majd ha igen akkor meghívom ezt a függvényt. Vagy pedig létrehozok egy objektumot a contactnak, és annak egy metódusa fogja ellátni a feladatot.

Újfent a kérdés, miért jobb az objektum? Mert 4 másodperc helyett 1-re csökken ami alatt rájössz hol kell keresned. Másrészt ha szükséged van az email küldésre, és betöltöd hozzá a function.php-t akkor vele együtt egy csomó más függvény is betöltődik, amire nincs is szükség. Míg ha objektumokkal dolgozol, akkor nem kerül bele sok felesleges dolog.

Azért mondom, hogy nem sok, mert ha mondjuk egy felhasználó menti a profilját, akkor általában teljesen felesleges betölteni a törlés vagy listázás függvényt, márpedig ezek is hozzá tartoznak az objektumhoz. Ok, nyilván néhány byteról vagy kbról beszélünk, de mégis. Ha a régi módszeremet venném elő, ahol a buli.php megnézte hogy a paraméterben lévő ?task=save mit kíván, akkor csak a buli_save.php-t töltötte be, ami tartalmazta a mentést, és egy átirányítást valahova.

Mindennek vannak előnyei és hátrányai, az objektum orientáltság rendezetté teszi a kódot, keretrendszert használva pedig gyakorlag rákényszerít, hogy szabályokhoz tartsd magad, amik egységessé teszik a programjaidat. Nagy hibám volt például, hogy kétféle képpen kezeltem az adatbázishoz való kapcsolódást. Mikor tanultam a php-t első megvalósításom ez volt:

1.
2.
3.
4.
5.
6.
//csatlakozás az adatbázsihoz
connect();
//mivel egy adatbázisban van 4 projekt, ezért a tábláknak kell egy prefix, hogy megismerjem őket, pl teleki_user
$t = $mysql['prefix']."user";
 
$sql = "SELECT name FROM $t WHERE id = 12"

Később a connect() függvény már kikereste a prefixet és visszaadta

1.
2.
3.
$prefix = connect()
$t = $prefix."user";
...

Hát sok mindent nem spóroltam meg magamnak, sőt igazából nem is tudom miért csináltam, a lényeg, hogy mindig előtte meg kell néznem, hogy az adott projektben hogy is kezeltem, különben nem fog működni.

Keretrendszernél nincs ez a probléma, mivel ott egyszer megtanulod hogyan kell, és onnantól kezdve mindenhol úgy kell. Meg van kötve a kezed, de ez egy szükséges dolog.

Összegzés

Azt mondhatnád, hogy ez megint minden volt csak az nem amire kiváncsi vagy, de szerintem ezt megtanítani személyesen is csak úgy tudnám, ha megmutatnám az összes rossz kódomat amit írtam, majd az egyre jobbakat, hogy végül mindenki megértse, hogy ááá ezért kell használni!

Én úgy tanultam, hogy elvállaltam egy munkát amihez kellett, nem volt választásom éjjel nappald példákat és dokumentációt olvastam, és egyszer csak megértettem. Nincs olyan pont ahol az ember értelmét látja az egésznek, egyszerűen el kell kezdeni és jön magától.

Ami még fontos, hogy szerintem én nem használnék oop-t ha nem hazsnálnék keretrendszert. Megkönnyíti a dolgod, egy csomó terhet levesz a válladról, és igazából nem is tudatosul benned, hogy te most objektum orientáltan programozol, egyszerűen azt mondod pl hogy ez Cakephp /ami persze csak a keretrendszer, de én ezt mondom/

Amit ajánlani tudok az a Cakephp, mert szerintem egyszerű, és ebben tudok is segíteni ha kell. Sokszor elakadtam, de fórumokon mindig találtam megoldást.

Amiben még tudok segíteni, az a kódjaim megosztása. Ahogy időm lesz a saját projektek készítésével, megosztom a kódokat és mindegyikhez fűzök megjegyzést, ebből rmeélem sokat tudtok majd tanulni.

  • www

    Szerintem elég lenne ha néhány alap dolgot, példával leírtál volna. Ezzel a bejegyzéssel (Te is érzed), kicsit még távolabb került az ember az OOP programozás elsajátításától. Ellenben segített az objektumok felismerésében.

    Szerintem sokat kell gyakorolni (2-3 nap nem elég), mire rájössz, hogy nem tudsz semmit!

    Nem csodálkozom, hogy első munkaként, ismeretlen keretrendszerben elakadtál a kolis honlappal.

    Jók a cikkeid csak így tovább!

  • www

    Szerintem elég lenne ha néhány alap dolgot, példával leírtál volna. Ezzel a bejegyzéssel (Te is érzed), kicsit még távolabb került az ember az OOP programozás elsajátításától. Ellenben segített az objektumok felismerésében.

    Szerintem sokat kell gyakorolni (2-3 nap nem elég), mire rájössz, hogy nem tudsz semmit!

    Nem csodálkozom, hogy első munkaként, ismeretlen keretrendszerben elakadtál a kolis honlappal.

    Jók a cikkeid csak így tovább!

  • Lewis

    Szia, 
    nem kötekedésképp, de az MVC nem keretrendszer, hanem programtervezési minta. Keretrendszernek nevezzük a CakePHP-t a Zend-et a Yii-t és még sorolhatnám. 
    Ja és még objektumoknál nem véletlenül osztályokra gondoltál?

    • http://67developer.hu/ Gergő 67

      Hali,
      így van, az objektum kifejezések osztályokra vonatkoznak, az MVC pedig tervezési minta. Nem nagyon voltam híve az OOP-nek amíg el nem kezdtem Java EE-t használni vagy Androidra programozni, ezért a fogalmakkal sem voltam teljesen tisztában, de gondoltam leírom amit tudok róla, talán ebből is lesz aki megért valamit. 
      Kösz hogy felhívtad rá a figyelmem, ha lesz időm kijavítom.

      • Lewis

        Látszott a tapasztalatlanságod. Bár nem nagyon szólhatok, hiszen csak alapokat tudom nem vagyok valami nagy OOP fejlesztő az Java nevétől is hányok…

        Mellesleg nagyon jó cikk :) Körülbelül én is így indultam – szinte még tartok is itt -. 

  • Lewis

    Szia, 
    nem kötekedésképp, de az MVC nem keretrendszer, hanem programtervezési minta. Keretrendszernek nevezzük a CakePHP-t a Zend-et a Yii-t és még sorolhatnám. 
    Ja és még objektumoknál nem véletlenül osztályokra gondoltál?

    • http://67developer.hu/ Gergő 67

      Hali,
      így van, az objektum kifejezések osztályokra vonatkoznak, az MVC pedig tervezési minta. Nem nagyon voltam híve az OOP-nek amíg el nem kezdtem Java EE-t használni vagy Androidra programozni, ezért a fogalmakkal sem voltam teljesen tisztában, de gondoltam leírom amit tudok róla, talán ebből is lesz aki megért valamit. 
      Kösz hogy felhívtad rá a figyelmem, ha lesz időm kijavítom.

  • Madi

    Kösz az írást, hasznos volt. :)

  • Madi

    Kösz az írást, hasznos volt. :)

  • jopa

    köszi, várjuk a folytatást :)

  • jopa

    köszi, várjuk a folytatást :)

  • Lewis

    Látszott a tapasztalatlanságod. Bár nem nagyon szólhatok, hiszen csak alapokat tudom nem vagyok valami nagy OOP fejlesztő az Java nevétől is hányok…

    Mellesleg nagyon jó cikk :) Körülbelül én is így indultam – szinte még tartok is itt -.