Warning
This page is located in archive.

OOP v PHP

Ú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.

abstraktnikosik.php

<?php
// abstaktni trida pro kosik
abstract class AbstraktniKosik {
	protected $zbozi; // pole zbozi
	protected $mnozstvi; //pole poctu kusu
 
	public function __construct() {
		$this->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.

  1. navrhněte rozhraní a třídy
  2. předpokládejme, že rozlišujeme události přidání a odebrání zboží
  3. implementujte jednoduchou třídu Ucetni a Logovac, které zpracují události nad košíkem
courses/a7b39wa1/tutorials/07/start.txt · Last modified: 2015/09/23 11:26 by xklima