Autor | Zpráva | ||
---|---|---|---|
lionel messi Profil |
Zdravím,
vytváram v OOP triedu pracujúcu s databázou. Jedna metóda zabezpečuje pripojenie a ďalšie uloženie/výpis. Problém môjho kódu však je, že pripojenie k DB sa v súčasnosti musí volať pri zavolaní každej jednej metódy, čo je často zbytočné v prípade, že už predtým bolo spojenie s DB nadviazané. Kód: <?php class VypisStatistiky { public function pripojDatabazu() { $databaza = new mysqli("server", "meno", "******", "databaza"); return $databaza; } public function vypisDen(mysqli $databaza) { //tu vypíšeme dáta } public function vypisStranky(mysqli $databaza) { //tu vypíšeme iné dáta } } ?> V tomto stave musím vždy pri volaní hociktorej metódy na výpis volať aj pripojenie, inak mi funkcie na prácu s DB vracajú Warning. Je možné sa tomuto „viacnásobnému“ pripojeniu vyhnúť (prípadne aj za cenu zmeny „architektúry“ triedy)? Ďakujem veľmi pekne za každú odpoveď. |
||
Taps Profil |
#2 · Zasláno: 11. 6. 2014, 20:38:22
lionel messi:
co tak využít konstruktor ? |
||
Martin02 Profil |
lionel messi:
Vytvoř si globální proměnnou, do které uložíš to připojení. V připojovací metodě se připojíš a to připojení uložíš do té globální proměnné. Pak k tomu můžeš přistupovat odkudkoli. <?php class VypisStatistiky { private $databaza; public function pripojDatabazu() { $this->databaza = new mysqli("server", "meno", "******", "databaza"); } public function vypisDen() { //tu vypíšeme dáta použitím proměnné "$this->databaza" } public function vypisStranky(mysqli $databaza) { //tu vypíšeme iné dáta použitím proměnné "$this->databaza" } } ?> A nebo, lépe to připojení dát už do konstruktoru, jak psal Taps. public function __construct() { $this->databaza = new mysqli(...); } Pak nemusíš vůbec volat metodu pripojDatabazu - to připojení tam bude už od inicializace třídy. |
||
Alphard Profil |
#4 · Zasláno: 11. 6. 2014, 20:43:05
Návrhově je blbost, aby třída pro výpis statistik sama řešila připojení k databázi. Takže vyčlenit a pak nebude problém použít vzor singleton nebo lépe dependency injection (v horším případě service locator).
A co ten výpis? Copak ta třída něco přímo vypisuje? Jestli jo, je to chyba, jestli ne, je blbě pojmenovaná. |
||
lionel messi Profil |
#5 · Zasláno: 11. 6. 2014, 20:54:09
Martin02, Taps:
Ďakujem veľmi pekne, s OOP len začínam, ten konštruktor je skvelý nápad. Alphard: „Takže vyčlenit[…]“ Vďaka za upozornenie, poučím sa. „A co ten výpis? Copak ta třída něco přímo vypisuje? Jestli jo, je to chyba, jestli ne, je blbě pojmenovaná.“ Áno, vypisuje, z toho dôvodu tie názvy metód. Ako to upraviť? Niečo na spôsob MVC? Vopred ďakujem za odpovede na zvedavé otázky. |
||
Alphard Profil |
#6 · Zasláno: 11. 6. 2014, 21:07:11
lionel messi:
„ten konštruktor je skvelý nápad“ Ne, tak jak to ukázali není. Dobrý nápad je pouze v konstruktoru předávat závislost. $s = new Statistiky($dbConnection); „Ako to upraviť? Niečo na spôsob MVC?“ Asi tak. Jedna třída má mít jednu zodpovědnost. To co tady vyrábíte, že se třída sama připojí k db (parametry ani nejsou v konfiguraci, ale pevně zadrátované), provedete dotazy, předpokládám další aplikační logiku a ještě to sama vypíše, to nemá s OOP nic společného. Mně je jasné, že se to člověk nenaučí za večer, ale upozorňuji na nedostatky. |
||
lionel messi Profil |
#7 · Zasláno: 12. 6. 2014, 11:24:30
Alphard:
„Mně je jasné, že se to člověk nenaučí za večer, ale upozorňuji na nedostatky.“ Ďakujem za pripomienky, veľmi si ich cením, ukázali mi istú cestu, kam sa uberať, ak sa chcem zlepšiť, idem sa vŕtať trebárs v tom MVC, ale z toho, čo som si už dnes ráno stihol naštudovať som pochopil slabiny svojho doterašieho "akože-OOP" prístupu. A to som ešte neukázal princíp fungovania tých dvoch "spaghetti" metód... |
||
Časová prodleva: 10 let
|
0