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
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
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
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
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);
V konstruktoru předáváme závislosti nezbytné pro funkci třídy.

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

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0