====== Ř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]