ugrás a tartalomhoz

Adatbázis kapcsolat elérése classokból

Anonymous · 2006. Már. 16. (Cs), 00.39
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
 
1

ezt nem így szokták

Anonymous · 2006. Már. 16. (Cs), 07.19
hanem az osztály fv-eiben, ahol szükséged van a kapcsolatra, ott behozod global $DB; -vel.
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.
3

&=

kempelen · 2006. Már. 18. (Szo), 17.19
Köszi, a &= jelet teljesen elfelejtettem, nem tudtam, hogy mindkét helyen (függvény def, értékadás) meg kell adni! Eddig még csak így használtam, ezért nem tűnt fel, hogy pl a fenti példa nem is referencia:

foreach($this->allWords as &$w)


(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
2

DAO

Hodicska Gergely · 2006. Már. 16. (Cs), 17.59
http://weblabor.hu/cikkek/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ő
4

&getConnection()

kempelen · 2006. Már. 18. (Szo), 17.29
Szia!

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!)
6

re: &getConnection()

Hodicska Gergely · 2006. Már. 19. (V), 21.04
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.

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.

mert ha esetleg Xaraya modul lesz belőle, ott is csak egy $valami =& xarDbGetConn()-ra kell csatlakoznom.

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.

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! :-)

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ő
7

factory

kempelen · 2006. Már. 19. (V), 21.22
Ezért is lehet jó Factory használata.


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! >;-)
5

pont jó téma

sayusi · 2006. Már. 18. (Szo), 17.56
hogy ezt feldobtad majd egy hete ilyennel küzdök és közbe kaptam még egy gentoo teljes reinstallt is...

köszi!