Adatbázis kapcsolat elérése classokból
Sziasztok!
Van egy proggim, ami csomó osztályt definiál és használ. A program az elején megnyit egy ADODB adatbázis kapcsolatot, amit szeretnék az osztályok rengetegében mindenhol használni, helyi recordsetek kinyitogatására.
Csináltam egy "nem osztályos" globális ilyet:
function &GetDbConn()
{
global $DB;
return $DB;
}
Így az osztályokban egyszerűen $DB = GetDbConn() és mehet minden.
A baj csak az, hogy az egyszerűség kedvéért a $DB-t az osztályok definiciójába tettem és a construktorban szerzem be a pointert. Így egyszerűnek és ésszerűnek tűnt, a függvényekben persze $this->DB->Execute érem el.
Probléma: mikor dumpolok ilyen classokat, mindig ott a sok adatbáziskapcsolati infó. Mégha a class maga csak 3 sima változó is lenne, ott egy óriási ADODB Connection objektum dump:
$w = new TranslationWord();
var_dump($w)
class TranslationWord
{
private $DB;
private $ID;
private $Word;
private $Count;
....
Lenne vagy 3 változó a dump, de nem, egy nagy ADODB connection.
Megoldás?
Azt értem, hogy ha nem class változó, hanem minden függvényben beszerzem a pointert, akkor ez a gond nem jelentkezik, de az mintha túl overshot lenne. Jobb ötlet?
Teljesen más jellegű megoldási javaslatok is jöhetnek, ennél biztos van jobb.
Köszi,
Lion/Kempelen
■ Van egy proggim, ami csomó osztályt definiál és használ. A program az elején megnyit egy ADODB adatbázis kapcsolatot, amit szeretnék az osztályok rengetegében mindenhol használni, helyi recordsetek kinyitogatására.
Csináltam egy "nem osztályos" globális ilyet:
function &GetDbConn()
{
global $DB;
return $DB;
}
Így az osztályokban egyszerűen $DB = GetDbConn() és mehet minden.
A baj csak az, hogy az egyszerűség kedvéért a $DB-t az osztályok definiciójába tettem és a construktorban szerzem be a pointert. Így egyszerűnek és ésszerűnek tűnt, a függvényekben persze $this->DB->Execute érem el.
Probléma: mikor dumpolok ilyen classokat, mindig ott a sok adatbáziskapcsolati infó. Mégha a class maga csak 3 sima változó is lenne, ott egy óriási ADODB Connection objektum dump:
$w = new TranslationWord();
var_dump($w)
class TranslationWord
{
private $DB;
private $ID;
private $Word;
private $Count;
....
Lenne vagy 3 változó a dump, de nem, egy nagy ADODB connection.
Megoldás?
Azt értem, hogy ha nem class változó, hanem minden függvényben beszerzem a pointert, akkor ez a gond nem jelentkezik, de az mintha túl overshot lenne. Jobb ötlet?
Teljesen más jellegű megoldási javaslatok is jöhetnek, ennél biztos van jobb.
Köszi,
Lion/Kempelen
ezt nem így szokták
de a te módszered is meg lehet csinálni, nem kell a GetDbConn fv sem, hanem így kezd a konstruktort:
global $DB;
$this->DB=&$DB;
a & jel a lényeg!
persze ilyenkor is nagy dumpjaid lesznek, de csak linkek.
&=
(Itt feltűnt, mert nem bírtam a $w-t módosítani nélküle! :-) )
Tehát a dumpolódást az osztállyal CSAKIS ÚGY tudom elkerülni, ha elfelejtem az osztályvátlozókat, és mindenhol beszertem a DB referenciát. (A sima global azért nem jó, mert a program amibe esetleg később integrálódni akarok (Xaraya), szintén függvénnyel adja meg a moduloknak. De persze senki sem csinált belőle classváltozót a konstruktorban, ahogy nézem a meglévő modulokat...)
Köszi,
Lion
DAO
Mondjuk azóta eszközöltem rajta pár apróságot, amit majd tervezek is átvezetni a cikkbe, de az alapelv változatlan, és elég jól bevált.
Felhő
&getConnection()
Nem értek valamit. Az első két kocka magában is működőképes? Mert az osztályt nem példányosítod és a függvényt pedig úgy hívod meg, ahogy én a static-okat "tanultam" (önképpzés :) ), de a függvény maga nem static.
Szép ez a módszer egyébként, de nekem nem szabad túlépítenem, mert ha esetleg Xaraya modul lesz belőle, ott is csak egy $valami =& xarDbGetConn()-ra kell csatlakoznom.
Ha az osztályokkal együtt dumpolás elkerülésére nincs megoldás (nagyon overshot egy 3 változós class print_r-jében egy adodb connection!), akkor kiszedem mindenhonnan a memberváltozót. Az értékadást úgyis javítanom kell a hibás &= miatt! :-)
Köszi!
Lion/KMP
ui: öröm látni, hogy itt PHP profik vannak, megyek is új kérdéssel a fórum elejére azonnal! (A Freenode-on a ##php csati siralmas!)
re: &getConnection()
Igen, ez működik magában is. A PHP 4-es verziójában nincsen statikus metódus. Az a függvény hívható statikusan, amelyikben nem használjuk a
$this
.Ezért is lehet jó Factory használata. Mindegyik osztályod erre épül, és ha ne adj isten, másképp szeretnéd a DB kapcsolatot megszerezni, akkor elég csak a Factory-n belül átalakítani a kódot, az alkalmazás számára ez teljesen transzparens marad.
Egy az alkalmazásod felépítését befolyásoló döntést na amitt hozz meg, mert a dump során az hátrányt jelent. Használd a jobbnak tűnő megoldást, ls ha kell csinálj egy saját dump függvényt.
Felhő
factory
Ez nagyon igaz! A következő lépés az lesz, megvizsgálom mit érdemes még factory-ba tenni, hogy valóban könnyen illeszthető legyen majd a fő rendszerbe (ha tényleg az lesz a sorsa). Köszi a jó ötletet, asszem másra is alkalmazhatom mint amire eredetileg kérdeztem! :-) Így az is megoldható, hogy nem kicserélni kell bizonyos részeket (ez volt a tervem), hanem csak átkonfigurálni!
A member DB referenciákat végül átvittem a függényekbe, úgyis csak kb a függvények felénél, vagy annyinál sem kell, és az &= miatt úgyis bele kellett nyúlni. Csinálok valami "jó gyárat", akkor még változhat, de nem member változó lesz az biztos.
Köszi a segítséget!
LionKMP
ui: Gyár! Mekkora ötlet! >;-)
pont jó téma
köszi!