Autor Zpráva
Argos
Profil
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
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
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.

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: