Mondjuk eggyel kevesebb gépelési hibával a címben ;)
dbobj - an open source object persistence layer for PHP
Ha kell setígség, szívesen átrajzolom egy kicsit, bár w3m-ben így is tökéletes.
üdv. krey
ps. egy nagy, fényes, wet floor-os Download now gomb :)
pps. Amúgy remek dolognak tartom (amennyire 10 perc alatt át lehetett nézni a példa source-t), de nem nagyon PHP-s ;)
A dbobj pedig elvégzi az adatbázis kezelését helyetted.
Ettől nem lesz PHP-s :)
Attól, hogy objektumokat kezelsz és a háttérben adatbázisműveletek játszódnak le.
A kód maga attól, hogyha nem lennének benne . , -> és hasonló jelek, akkor nem tudnám, hogy milyen nyelven van, ez nem feltétlenül rossz :D
Mellesleg egy windows build nem lenne rossz, egy MySQL (InnoDB) verzióról nem is beszélve.
üdv. krey
ps. a dbobj név jellemző... Miért nem lehet valami hangzatos nevet adni az ilyen jó kis projecteknek? A Firefoxot sem hívják opensourceXULandJSbrowser-nek (OSXULAJSB)
Azért jó, mert SQL lekérdezések és parancsok írása helyett a program logikájának megvalósítására tudsz koncentrálni. A dolog egy teljesen objektum orientált felületet biztosít az adataid kezeléséhez. A dolog akkor érdekes, ha amúgy is objektum-orientáltan készíted a PHP programot, mert így nem kell azzal foglalkoznod, hogy az adatok hol és hogy vannak tárolva. Egyszerűen meghatározod az osztályaidat és használod az objektumaidat. A dbobj pedig elvégzi az adatbázis kezelését helyetted.
Hallottál már az Active Record (AR) nevű találmányról. Első blikkre amit készítettél az pontosan az. Illetve nem pontosan az, hiszen AR-nál nincs szükség az osztály elején a mezők leírására, ugyanis azt az információt közvetlenül az adatbázisból nyeri (magyarul elég egy táblanevet megadni neki).
Viszont kiváncsi lennék, hogy ez mennyivel jobb, mintha pl. az AdoDB ActiveRecord osztályát használnád?
Egyébként az AR egy nagyon szép implementációját láthatod müködés közben, ha kipróbálod a CakePHP-t (Rails-szerű framework php alapon).
Another issue is performance. For performance sensitive code, using direct SQL will always be faster than using Active Records due to overhead and the fact that all fields in a row are retrieved (rather than only the subset you need) whenever an Active Record is loaded.
A dbobj projekt célja pontosan az, hogy egy olyan ORM rendszert hozzunk létre, aminek teljesítménye - sok esetben - megközelíti a közvetlen SQL -alapú adatbázis kezelés teljesítményét.
Ezért van az, hogy ő nem térképezi fel minden futásnál az adatbázist, mivel ez sok felesleges műveletet eredményez. Szintén ezért készült a modul C-ben, és nem PHP-ban.
Ez természetesen azt jelenti, hogy felhasználási köre jóval szűkebb, mint a "programozóbarátabb" társaié, viszont a teljesítménye miatt alkalmas erőforrás-kritikus siteok és alkalmazások meghajtására is.
Ha egyszer lessz időm, akkor megírom a kompatibilitási réteget az ADOdb Active Record-hoz és a többi hasonló PHP-s megoldáshoz, hogy ha egy site kinövi erőforrásait, akkor minél egyszerűbben lehessen áttérni dbobj-ra.
Tudom, hogy a dbobj konfigurálása egy kicsit körülményes, de ez azért van, hogy - némi PHP kódolással - bármelyik ADOdb Active Record szerű megoldás helyére be lehessen állítani jelentős teljesítmény romlás nélkül.
Most már tisztábban látom a dolgot. Ezek szerint a cél gyakorlatilag egy adodb készítése csak C extensionként.
Viszont azt vettem ki a példakódból, hogy a db kapcsolathoz be kell állítani a dbobj.connStr php változót. Azonban sok (leginkább ingyenes) tárhely tiltja az ini_set függvényt és társait (ahogy a .htaccess-t is), ezért itt teljesen használhatatlan (ingyenes szervereken).
Mi lenne, ha eleve a php-s $dbobj_config-ban szereplnének az adatbázis adatai.
Megnéztem a forum példakódot is. Ez a dbobj_find függvény használata kicsit macerásnak tűnik. Nem lenne egyszerűbb egy alábbi megvalósítás (?) :
class user extends dbobj {
...
}
$user->id = $id;
$user->current();
Ahol a $user->current() automatikusan futtatja a dbobj_find()-ot az adott objektumon az user->id mezőre, mint feltételre (az id helyett minden esetben persze a kulcs szerepel). (Tudom, kicsit /nem is kicsit/ cakephp-s, de hát annyira tetszik.)
Ui: látom én, hogy a dbobj_find() ennél szélesebb körű használatra hivatott (bármelyik mező alapján mehet a lekérdezés), viszont most az objektumot csak adattárolásra használod, a funkciók külső függvényekkel van megoldva.
Igazad van, az adatbázis kapcsolat paramétereinek helye tényleg az osztályban van, majd ha lesz időm (pár más dolog mellett pl. case-sensitivity) ezt is átrakom az osztály-konfigba.
Ami a te általad mutatott keresési folyamatot illeti, nekem nem tetszik. Nem azért, mert nem lehetne megcsinálni, hogy a dbobj támogassa. Sőt ... talán még nem is lenne bonyolult.
Inkább koncepcionális problémám van vele: a $user objektum mi? Előszőr ugye csak egy üres objektum, amiben beállítasz pár paramétert, majd aztán kötöd össze egy adatbázis rekorddal. Ahogy én látom a dolgokat, ez nem konzisztens.
A dbobj filozófiája az, hogy egy kezelt objektum mindig kötődjön adatbázis-rekordhoz. Persze amikor új objektumot készítesz, akkor először az még csak a memóriában van, de előbb-utóbb mentésre kerül az adatbázisba (ha útközben nem törlöd).
Tehát ami nem tetszik nekem, az az, hogy egy értékadásnak látszó dolog egyszerre jelentheti egy adatbázisban található mező frissítését, és egy keresési paraméter állítását is. Szerintem ez igazából két különböző osztály (egy rekord-kereső, és egy rekord-kezelő) összemosása.
Abban megintcsak igazat adok neked, hogy a dbobj_find használata macerás. Ha Ruby-ban lennénk, akkor biztos másként lenne, de a PHP nem olyan Rugalmas nyelv, hogy öröklődéskor automatikusan lehessen statikus metódusokat definiálni, úgyhogy ezt kénytelen vagyok a programozóra bízni.
Az én megoldásom:
class user extends dbobj {
...
static function find($what = array()) {
return dbobj_find('user',$what);
//később majd inkább dbobj::find(...)
}
...
}
$user = user::find($id);
Értelek. Szóval keresési funkciókat a dbobj_find végzi, míg az objektumok csak az átmeneti tárolást és visszaírást (kezelési funkciók).
Viszont abban a pillanatban, hogy van egy user::find($id) metódusod, már össze is mostad a kettőt.
Tehát ami nem tetszik nekem, az az, hogy egy értékadásnak látszó dolog egyszerre jelentheti egy adatbázisban található mező frissítését, és egy keresési paraméter állítását is.
Ez nagyon szépen különválasztható, hiszen a user::id = "valami" csak egy értékadás, a funkciót az utána hívott függvény látja el (legyen a neve akár user::current() vagy user::read() ami beolvas, esetleg user::set() vagy user::save() ami pedig ment).
Most hogy így leírtam a dolgokat én is érzek benne némi inkonzisztenciát.
UI.: van a cucchoz némi doksi is(?), mert én nem találtam az oldalon és anélkül elég nehéz próbálgatni a dolgokat.
Először vitatkoznék veled:
A dbobj::find metódus statikus, nem (közvetlenül) az objektumokra vonatkozik, hanem az osztályra. Kicsit olyan, mintha lenne egy tábla (vagy osztály) osztály ( bár ez elég hülyén hangzik). Mindenesetre az objektumokon (azaz rekordokon) dolgozó (nem statikus) metódusok és osztályra (táblára) vonatkozó (statikus) metódusok szerintem jól elválnak egymástól. Gyakorlatilag a tábla-osztály, rekord-objektum analógiát használom. Lehet, hogy kicsit tényleg keverednek itt a dolgok, de szerintem még mindig jobban járunk ezzel, mintha lenne egy "osztály osztály". Ez így sokkal jobban integrálódik a PHP objektum orientált felületébe.
Ami a dokumentációt illeti: a cucchoz van egy elég komoly, sok oldalas (és magyar nyelvű) dokumentáció, amit a szakdolgozathoz csináltam. Ha lesz egy kis időm, kicsit megszerkesztem és egy wiki-n közzéteszem. Ha nem akarod megvárni, akkor küldj egy levelet, és elküldöm neked, csak nem akarom még ilyen nyers formában közzétenni.
Weboldal
Néhány szín, kép?
Ha kell setígség, szívesen átrajzolom egy kicsit, bár w3m-ben így is tökéletes.
üdv. krey
ps. egy nagy, fényes, wet floor-os Download now gomb :)
pps. Amúgy remek dolognak tartom (amennyire 10 perc alatt át lehetett nézni a példa source-t), de nem nagyon PHP-s ;)
nem nagyon PHP-s?
Másodszor mit értesz azon, hogy nem nagyon PHP-s a példa source?
ja igen
Ettől nem lesz PHP-s :)
Attól, hogy objektumokat kezelsz és a háttérben adatbázisműveletek játszódnak le.
A kód maga attól, hogyha nem lennének benne . , -> és hasonló jelek, akkor nem tudnám, hogy milyen nyelven van, ez nem feltétlenül rossz :D
Mellesleg egy windows build nem lenne rossz, egy MySQL (InnoDB) verzióról nem is beszélve.
üdv. krey
ps. a dbobj név jellemző... Miért nem lehet valami hangzatos nevet adni az ilyen jó kis projecteknek? A Firefoxot sem hívják opensourceXULandJSbrowser-nek (OSXULAJSB)
Ez van...
Windows-on viszont már most lefordul és működik a dolog.
A név választással kapcsolatban pedig ... nyitott vagyok a javaslatokra :) Tekintsük a dbobj-ot fejlesztési kódnévnek.
miert?
azért, mert ...
Active Record
Viszont kiváncsi lennék, hogy ez mennyivel jobb, mintha pl. az AdoDB ActiveRecord osztályát használnád?
Egyébként az AR egy nagyon szép implementációját láthatod müködés közben, ha kipróbálod a CakePHP-t (Rails-szerű framework php alapon).
Pontosan!
Had idézzek a az általad linkelt hanlapról:
A dbobj projekt célja pontosan az, hogy egy olyan ORM rendszert hozzunk létre, aminek teljesítménye - sok esetben - megközelíti a közvetlen SQL -alapú adatbázis kezelés teljesítményét.
Ezért van az, hogy ő nem térképezi fel minden futásnál az adatbázist, mivel ez sok felesleges műveletet eredményez. Szintén ezért készült a modul C-ben, és nem PHP-ban.
Ez természetesen azt jelenti, hogy felhasználási köre jóval szűkebb, mint a "programozóbarátabb" társaié, viszont a teljesítménye miatt alkalmas erőforrás-kritikus siteok és alkalmazások meghajtására is.
Ha egyszer lessz időm, akkor megírom a kompatibilitási réteget az ADOdb Active Record-hoz és a többi hasonló PHP-s megoldáshoz, hogy ha egy site kinövi erőforrásait, akkor minél egyszerűbben lehessen áttérni dbobj-ra.
Tudom, hogy a dbobj konfigurálása egy kicsit körülményes, de ez azért van, hogy - némi PHP kódolással - bármelyik ADOdb Active Record szerű megoldás helyére be lehessen állítani jelentős teljesítmény romlás nélkül.
Észrevétel
Viszont azt vettem ki a példakódból, hogy a db kapcsolathoz be kell állítani a dbobj.connStr php változót. Azonban sok (leginkább ingyenes) tárhely tiltja az ini_set függvényt és társait (ahogy a .htaccess-t is), ezért itt teljesen használhatatlan (ingyenes szervereken).
Mi lenne, ha eleve a php-s $dbobj_config-ban szereplnének az adatbázis adatai.
Megnéztem a forum példakódot is. Ez a dbobj_find függvény használata kicsit macerásnak tűnik. Nem lenne egyszerűbb egy alábbi megvalósítás (?) :
Ui: látom én, hogy a dbobj_find() ennél szélesebb körű használatra hivatott (bármelyik mező alapján mehet a lekérdezés), viszont most az objektumot csak adattárolásra használod, a funkciók külső függvényekkel van megoldva.
static function find
Ami a te általad mutatott keresési folyamatot illeti, nekem nem tetszik. Nem azért, mert nem lehetne megcsinálni, hogy a dbobj támogassa. Sőt ... talán még nem is lenne bonyolult.
Inkább koncepcionális problémám van vele: a $user objektum mi? Előszőr ugye csak egy üres objektum, amiben beállítasz pár paramétert, majd aztán kötöd össze egy adatbázis rekorddal. Ahogy én látom a dolgokat, ez nem konzisztens.
A dbobj filozófiája az, hogy egy kezelt objektum mindig kötődjön adatbázis-rekordhoz. Persze amikor új objektumot készítesz, akkor először az még csak a memóriában van, de előbb-utóbb mentésre kerül az adatbázisba (ha útközben nem törlöd).
Tehát ami nem tetszik nekem, az az, hogy egy értékadásnak látszó dolog egyszerre jelentheti egy adatbázisban található mező frissítését, és egy keresési paraméter állítását is. Szerintem ez igazából két különböző osztály (egy rekord-kereső, és egy rekord-kezelő) összemosása.
Abban megintcsak igazat adok neked, hogy a dbobj_find használata macerás. Ha Ruby-ban lennénk, akkor biztos másként lenne, de a PHP nem olyan Rugalmas nyelv, hogy öröklődéskor automatikusan lehessen statikus metódusokat definiálni, úgyhogy ezt kénytelen vagyok a programozóra bízni.
Az én megoldásom:
Boldog karácsonyt
Viszont abban a pillanatban, hogy van egy user::find($id) metódusod, már össze is mostad a kettőt.
Ez nagyon szépen különválasztható, hiszen a user::id = "valami" csak egy értékadás, a funkciót az utána hívott függvény látja el (legyen a neve akár user::current() vagy user::read() ami beolvas, esetleg user::set() vagy user::save() ami pedig ment).
Most hogy így leírtam a dolgokat én is érzek benne némi inkonzisztenciát.
UI.: van a cucchoz némi doksi is(?), mert én nem találtam az oldalon és anélkül elég nehéz próbálgatni a dolgokat.
Boldog karácsonyt mindenkinek!
A dbobj::find metódus statikus, nem (közvetlenül) az objektumokra vonatkozik, hanem az osztályra. Kicsit olyan, mintha lenne egy tábla (vagy osztály) osztály ( bár ez elég hülyén hangzik). Mindenesetre az objektumokon (azaz rekordokon) dolgozó (nem statikus) metódusok és osztályra (táblára) vonatkozó (statikus) metódusok szerintem jól elválnak egymástól. Gyakorlatilag a tábla-osztály, rekord-objektum analógiát használom. Lehet, hogy kicsit tényleg keverednek itt a dolgok, de szerintem még mindig jobban járunk ezzel, mintha lenne egy "osztály osztály". Ez így sokkal jobban integrálódik a PHP objektum orientált felületébe.
Ami a dokumentációt illeti: a cucchoz van egy elég komoly, sok oldalas (és magyar nyelvű) dokumentáció, amit a szakdolgozathoz csináltam. Ha lesz egy kis időm, kicsit megszerkesztem és egy wiki-n közzéteszem. Ha nem akarod megvárni, akkor küldj egy levelet, és elküldöm neked, csak nem akarom még ilyen nyers formában közzétenni.