Jump to content
php.lv forumi

divas classes tandēmā


hmnc

Recommended Posts

Ir viens jautājums, kas pavisam nedaudz nomoka manu prātu. Tā kā OOP neesmu īpaši spēcīgs un programmēju es visbiežāk līdz tam līmenim, līdz kuram sniedzas manas zināšanas tad nolēmu, ka derētu pajautāt gudrākiem cilvēkiem.

Ir viena klase (sauksim to par lietotāju klasi), kurai nu ļoti ļoti derētu darboties ap datubāzēm (select, insert, update, delete...), bet te man jau ir datubāzes klase (kura veic query, var_query, utt), kura tiek aktīvi izmantota. Līdz ar to nonāku pie problēmas - kā _LABĀK_ savieno abas klases. resp - iekš lietotāju klases brīvi lietot datubāzes klasi, jo datubāzes klase tā tāda pierasta un ļoti ērta lieta.

 

class a extends class b, kaut kā īsti negribēja strādāt (datubāzes klase meta ārā gļukainus paziņojumus, kurus īsti nevarēja novērst) vai arī mans curve_hands.dll nesniedzās līdz tam līmenim lai tas strādātu.

otrs veids ko izmēģināju - izsaucu datubāzes klasi iekš lietotāju klases šādā variācijā:

$this->db = new db_class(login,pass,host,blabla);

bet šāds variants man likās visnotaļ līks (a varbūt nemaz nav). + likās līki taisīt divas konekcijas datubāzes (new db_class arī tiek izsaukts ārpus lietotāju klases).

So.. kādi piedāvājumi?

 

Jau iepriekš - paldies.

p.s.

Nevajag tikai fleimot par to cik labs/slikts OOP ir + vai viņu vajag/nevajag lietot.

Ir problēma - vajag risinājumu. paldies :)

Link to comment
Share on other sites

Šādiem mērķiem man liekas visai labi noder triviālākais no patterniem - singleton patterns. Būtībā tas ir mehānisms, kā visur, kur tev vien ir nepieciešams, var darboties ar vienu klases instanci. Tavā gadījumā darbs ar db ir ļoti labs piemērs - tev ir nepieciešama viena konekcija, kuru tu izmanto visā savā programmā. Neatkarīgi no tā, vai tā ir kāda klase vai vienkārši parasts skripts.

 

Singleton patterns izskatās apmēram šādi:

http://paste.php.lv/1540

 

Tagad visās vietās, kur tev ir nepieciešams savienojums ar datubāzi, tu nevis raksti $db = new MySQL(), bet $db = MySQL::instance() un darbojies ar vienu vienīgo DB objektu.

 

Ja mazliet nav skaidrs, kā tas darbojas, tad izstāstīšu. Klases metodes var izsaukt arī tad, kad vēl neeksistē pati klases instance (izmantojot sintaksi KlasesVaards::MetodesVaards()). Attiecīgi vēl pirms DB objekta izveidošanas mēs izsaucam instance() metodi, kura pārbauda vai DB objekts jau ir uztaisīts vai nē. Ja objekts ir uztaisīts, tad tiek atgriezta norāde uz uztaisīto objektu. Ja objekts vēl nav uztaisīts, tad instance() metode to veiksmīgi izdara un atgriež norādi uz tikko izveidoto objektu. Tādā veidā tiek panākts, ka neskaitāmas reizes izsaucot MySQL::instance() visā skripta gaitā, tu vienalga iegūsi vienu konekciju.

 

Tagad par to, kā sadarboties divām klasēm.

Man jau liekas, ka tevis pieminētajam variantam par $this -> db nav nekādas vainas. Pats tā esmu darījis un nekādu problēmu nav bijis. Esmu darījis arī tā, ka tajās klases metodēs, kur ir nepieciešams savienojums ar datubāzi, izmantoju iepriekš aprakstīto singleton patternu.

 

Nepretendēju uz vienīgo un pareizo risinājumu, bet tas man liekas tīri saprātīgs.

Link to comment
Share on other sites

Kapēc nelietot globālu mainīgo $My_super_db_connection, ko inicializē faila sākumā?

12772[/snapback]

 

viss sarežģītais ir elementārs! kā gan varēju aizmirst par šo variantu :D

Paldies Smejmoon!!

 

bet tomēr gribu uzzināt arī par tām klasēm - kas tur aizgājis greizi.

Link to comment
Share on other sites

hee. Paldies par atbildi Kaklz! Bet man kaut kā neiet tomēr :(

http://paste.php.lv/1544

outputā izlien ārā divas konekcijas. mēģināju visdažādākajos veidos, bet tomēr nekādu rezultātu.

varbūt esmu kādu kļūdu pieļāvis, kuru vēl īsti nesaprotu?! :)

ok. paldies vēlreiz.

12773[/snapback]

Tas tāpēc, ka reku šeit:

$db = new db();

tu izveido papildus konekciju!

A vajag taču $db = db::instance(); kā pats dažas rindiņas augstāk raksti.

Link to comment
Share on other sites

Tas tāpēc, ka reku šeit:

$db = new db();

tu izveido papildus konekciju!

A vajag taču $db = db::instance(); kā pats dažas rindiņas augstāk raksti.

12776[/snapback]

 

aahhh!!! viss aizgāja ;)

ok paldies visiem, kuri man palīdzēja!

Link to comment
Share on other sites

×
×
  • Create New...