Autor | Zpráva | ||
---|---|---|---|
Argos Profil |
#1 · Zasláno: 7. 4. 2009, 10:54:29
Ahoj, už nějaký ten pátek dělám v php, nicméně nedávno jsem se rozhodl, že bych mohl nějaký projekt zkusit objektově. Mám však hned několik problémů:
Problém aktuální: mám třídu pro spojení s MySQL databází (jmenuje se Mysql - pro můj případ bude stačit vědět že má implementovanou metodu sql, která provede dotaz sql), poté mám druhou třídu která se stará, řekněme o správu menu z databáze (ta se jmenuje Menu). Rád bych použil Instanci třídy Mysql v instanci třídy Menu, tedy: class Menu{ public function pridejDoMenu($jmeno_polozky){ return $sql->sql("INSERT INTO ... "); } } $sql=New Mysql(); $menu=New Menu($sql); jenže co teď - $sql nemohu zavolat uvnitř objektu Menu, jelikož zde neexistuje(ani nelze předat jako parametr, alespoň mě se nepovedlo parametrem přenést objekt), také nelze proměnnou použít přímo jak je napsáno výš - jelikož proměnná $this se nenahradí za Mysql nýbrž za Menu, ze které je volána, třída Menu však metodu sql neobsahuje a php končí chybu. Zároveň nechci vytvářet v objektu Menu novou instanci Mysql, jelikož tímto způsobem bych se v jednom načtení stránky připojoval k databázi třeba i 10x a to v každé tříde která objekt MySQL potřebuje - a právě spojení s sql serverem jak víme, je docela brzda(rád bych proto jednou založil instanci třídy Mysql, která by měla implementovaný systém cachování dotazů a pokud by jeden dotaz proběhl v několika různých instancích vícekrát, nedotazovala by se přímo serveru, nicméně vrátila by výsledek načtený již v předchozím volání) - ukládat však tyto hodnoty přímo do třídy bez instance mi přijde trochu prasečina. Tedy otázky: Chápu to celé špatně? Jde to udělat jinak, lépe(aniž bych se musel k db připojovat v každém objektu znovu = nová instance)? |
||
Mastodont Profil |
#2 · Zasláno: 7. 4. 2009, 11:05:22 · Upravil/a: Mastodont
Můžeš použít statické metody (a spousta puristů tě zabije :-)) nebo tzv. dependency injection, při které se odkazy na již existující objekty předávají v konstruktoru - což jsi ty neudělal):
DAO::getData($sql ....); // statická metoda, je dostupná všude class Menu { private $sql; public function __construct($sql) { $this->sql = $sql; } } |
||
Argos Profil |
#3 · Zasláno: 7. 4. 2009, 12:02:49
Aha, nechápu co jsem předtím dělal jinak, ale samozřejmě jsem to zkoušel i přes konsruktor a nešlo, nicméně teď když jsem měl jistotu že tohle jít musí, zkusil jsem to znovu a funguje :-D - tedy děkuji. Asi před pěti dny jsem měl problém s předávání proměnné z jedné instance do druhé (klasicky proměnná $debug) Nyní je mi jasné že celá věc půjde řešit výše zmíněným způsobem, a nebo konstantou, kterou jsem to nakonec řešil já - možná to ale ještě přepíšu - chtěl bych totiž aby se debug mod dal zapnout jednotlivě u všech instancí tříd, ale i globálně pro celý projekt.
Jinak objektové programování v PHP (začínám nyní asi potřetí, nicméně ve škole jsme začali OOP v Javě a tak je mi mnoho pojmů jasnějších než tomu bylo na střední) mohu všem jedině doporučit - pro mě je krása v tom, že až za dva roky přijdu ke svým scriptům a začnu si nadávat jak jsem takovou prasečinu mohl napsat(což se zrovna mě stává tak s půlročním spožděním u všech scriptů které píšu), prostě jenom změním danou metodu nebo celou třídu, ale vše ostaní zůstane zachováno. Takže všichni se pěkně učte ooPHP a třeba se jednou sejdeme u eshopu, který hodlám vydat pod nějakou volnější licencí a hlavně striktně objěktově psaný. :-D - No dobrá, jsou to jenom plány, zatím jsem skončil u vytvoření jednoduchého systému šablon, tak aby nebyl problém napsat si jednoduchou šablonu pro eshop i bez znalosti scriptování a hlavně co nejvíce oddělit aplikační a prezentační logiku. |
||
Časová prodleva: 16 let
|
0