====== OOP v PHP ====== /* * [[courses:A7B39WA1:solutions:07:start_2010]] {{courses:A7B39WA1:tutorials:07:7_reseni.zip|}} */ ===== Úkol 1 ===== Zakládáte nový projekt, ve kterém bude veškerá funkcionalita zabalena do tříd a rozhraní. Zajistěte, aby načítání tříd bylo automatické bez nutnosti psát explicitní direktivy include, include_once resp. require a require_once. Nápověda: * Zaveďte jednotné pojmenování tříd a souborů. * Založte jeden skript, který byde iniciální nastavení systému řešit. Tento skript nazvěte //bootstrap.php// * Pomocí funkce //autoload// definované v souboru //bootstrap.php// docílíte požadované funkcionality. ===== Úkol 2 ===== Předpokládejme, že chcete napsat obecný e-shop.\\ Budete prodávat zboží, které má jednoznačné //ID//, //Cenu// a //DPH// sazbu.\\ Navrhněte rozhraní pro typ //Zbozi//. Jak ho namodelujete? Vytvořte alespoň dva rozdílné druhy zboží, například vzducholodě (Objem, Nosnost, Dostup) a knihy (Autor, Název, ISBN). Jak se liší? Co mají společného? ===== Úkol 3 ===== Do systému zařaďte níže uvednou třídu //AbstraktniKosik//, která z velké části implementuje košík pro jednoho uživatele systému.\\ Implementujte vlastni třídu SessionKosik, která uloží obsah košíku do session prostoru. zbozi = array(); $this->mnozstvi = array(); } public function pridej(Zbozi $co, $kolik) { $kolik = intval($kolik); if ($kolik <= 0) return; foreach ($this->zbozi as $klic => $zbozi) { if ($co->getID() == $zbozi->getID()) { $this->mnozstvi[$klic] += $kolik; return; } } $this->zbozi[] = $co; $this->mnozstvi[] = $kolik; } public function odeber (Zbozi $co, $kolik) { $kolik = intval($kolik); if ($kolik <= 0) return; foreach ($this->zbozi as $klic => $zbozi) { if ($zbozi->getID() == $co->getID()) { $aktualni_pocet = $this->mnozstvi[$klic]; if ($aktualni_pocet-$kolik <= 0) { unset($this->zbozi[$klic]); unset($this->mnozstvi[$klic]); } else { $this->mnozstvi[$klic] -= $kolik; } } } } // ulozi obsah kosiku public abstract function uloz(); //nacte obsah ulozeneho kosiku public abstract function nacti(); } ?> ===== Úkol 4 ===== Rozšiřte SessionKosik tak, aby z této třídy nebylo možné vyrobit více než jednu instanci. \\ Nápověda: * Použijte vzor Singleton Odpovězte na otázku: * Proč by měl existovat právě jeden košík pro daného uživatele? * Pokud by existovalo více instancí košíku, jaký by to mělo význam? ===== Úkol 5 (podle časových možností domácí)===== Váš projekt je třeba rozšířit o komponenty, které budou "poslouchat" nad událostmi nad košíkem. Takových komponent může být libovolné množství, všechny mají ale společnou vlastnost a to, že zpracovávají košíkové události. - navrhněte rozhraní a třídy - předpokládejme, že rozlišujeme události přidání a odebrání zboží - implementujte jednoduchou třídu //Ucetni// a //Logovac//, které zpracují události nad košíkem /* ===== Řešení ==== {{ http://course-wa1.felk.cvut.cz/~vlachzd1/reseni/07.zip | 07 classes}} */