====== Řešení PHP OOP ====== ===== Úkol 1 ===== Pak každý hlavní skript musí vložit bootstrap.php ==== Úkol 2 ==== Nejprve zavedeme společné rozhraní Zbozi Pak jednotlivé třídy, které se mají stát zbožím, musí toto rozhraní také implementovat. objem = $objem; $this->nosnost= $nosnost; $this->dostup = $dostup; } public function getId() { return $this->id; } public function setId($id) { $this->id = $id; } public function getCena() { return $this->cena; } public function setCena($cena) { $this->cena = $cena; } public function getDPH(){ return $this->dph; } public function setDPH($dph) { $this->dph = $dph; } public function getObjem() { return $this->objem; } public function getNosnost() { return $this->nosnost; } public function getDostup() { return $this->dostup; } } ?> autor = $autor; $this->nazev = $nazev; $this->isbn = $isbn; } public function getId() { return $this->id; } public function setId($id) { $this->id = $id; } public function getCena() { return $this->cena; } public function setCena($cena) { $this->cena = $cena; } public function getDPH(){ return $this->dph; } public function setDPH($dph) { $this->dph = $dph; } public function getAutor() { return $this->autor; } public function getNazev() { return $this->nazev; } public function getIsbn() { return $this->isbn; } } ?> ==== Úkol 3 ==== Pozor, pokud chceme využívat session kdekoli v projektu, je nutné dát //session_start();// do //bootstrap.php// Řešení: obsah; } public function load() { if (isset($_SESSION[Sessionkosik::SESSION_NAME])) { foreach ($_SESSION[Sessionkosik::SESSION_NAME] as $klic=>$hodnota) { $this->obsah[$klic] = $hodnota; } } } } ?> ==== Úkol 4 ==== Protože není dovoleno přestínit metody se snižujícími se právy, tj. není možné udělat Singlekosik extends SessionKosik a u SingleKosik mi privátní konstruktor, udělmáme to jinak: Použití pak vypadá takto: load(); // nejake dalsi operace s kosikem $kosik->save(); ?> ==== Úkol 5 ==== Nejprve rozhraní Ted trida udalosti ( zde je vhodna i hierarchie trid) zbozi = $z; $this->pocet = $pocet; } public function getZbozi() { return $this->zbozi; } public function getPocet() { return $this->pocet; } } ?> Třídy implementující eventlistenery, tj. Logocac a Ucetni Logovac zaregistroval udalost"; if ($e->getPocet()>=0) { echo "pridano "; $pocet = $e->getPocet(); } else { echo "odebrano "; $pocet = -$e->getPocet(); } echo $pocet." ks zbozi s id: ".$e->getZbozi()->getId(); } } ?> Ucetni zaregistroval udalost"; if ($e->getPocet()>=0) { echo "pridano "; $pocet = $e->getPocet(); } else { echo "odebrano "; $pocet = -$e->getPocet(); } echo $pocet." ks zbozi s id: ".$e->getZbozi()->getId(); } } ?> Musíme upravit Sessionkosik tak, aby vyhazoval události. Pozor, pro jednoduchost je prezentováno vyhazování události jen na dvou metodách, mělo by se to ale rozšířit na všechny. listeners = array(); } public function addEventListener(Kosikeventlistener $l) { if (!in_array($l, $this->listeners)) { $this->listeners[] = $l; } } public function removeEventListener(Kosikeventlistener $l) { foreach ($this->listeners as $klic=>$listener) { if ($listener === $l) { unset($this->listeners[$klic]); } } } protected function rozesliUdalost (Kosikevent $udalost) { foreach ($this->listeners as $listener) { $listener->processEvent($udalost); } } // predefinujeme existujici metody public function pridat(Zbozi $z, $pocet = 1) { parent::pridat($z,$pocet); $this->rozesliUdalost(new Kosikevent($z,$pocet)); } public function odebrat(Zbozi $z, $pocet = 1) { parent::odebrat($z, $pocet); $this->rozesliUdalost(new Kosikevent($z, -$pocet)); } } ?> No a to je vše :-) Teď to jenom použijeme v praxi: require ('bootstrap.php'); $vzducholod = new Vzducholod(100, 1000, 100000); $vzducholod->setCena(123); $vzducholod->setDPH(0.2); $vzducholod->setId("vz01"); $kosik = new Sledovatelnysessionkosik(); $logovac = new Logovac(); $ucetni = new Ucetni(); $kosik->addEventListener($logovac); $kosik->addEventListener($ucetni); $kosik->load(); $kosik->pridat($vzducholod, 2); $kosik->odebrat($vzducholod,1); $kosik->save(); {{:tutorials:solutions:07:cviceni_07_reseni.zip| Řešení v jednom souboru}} [ZIP]