Jdi na navigaci předmětu

04 - Používáme OOP - jmenné prostory, rozhraní, traits, type hinting, late static binding

Cvičení se věnuje jednak obecným postupům v OOP jako jsou abstraktní třídy, rozhraní. Jednak se věnuje vlastnostem specifickým pro PHP jako jsou traits, type hinting či implementace late static binding.

Teoretická část

Řešená problematika

Úkolem pro toto cvičení je rozšířit datový model a doplnit funkcionalitu, která bude s modelem pracovat.

  • Pro všechny modelové třídy budeme chtít automaticky generovat ID, tato hodnota musí být unikátní pro každou instanci jedné třídy (tj. dvě instance různých tříd mohou mít stejné ID).
  • U produktů budeme evidovat nový atribut sazbu daně.
  • Budeme rozlišovat neregistrovaného a registrovaného zákazníka. Neregistrovaný se může stát registrovaným. Pro registrovaného zákazníka budeme navíc evidovat počet věrnostních bodů – při registraci získá daný počet bodů.
  • Při dokončení objednávky se nastaví datum dokončení objednávky a spočítají věrnostní body pro registrovaného zákazníka. Počet bodů bude odvozen od celkové ceny objednávky.

Úlohy

  1. Vytvořte jmenný prostor Model a všechny modelové třídy do něj umístěte. Upravte autoloader tak, aby podporoval jmenné prostory.
  2. Vytvořte trait pro generování unikátního ID – včetně atributu id, metody getId. Tento trait použijte ve všech modelových třídách. Ve třídách odstraňte případný původní kolidující atribut a funkcionalitu.
  3. Ve třídě Product vytvořte atribut vatRate pro sazbu daně. Vytvořte metodu getPriceVat(), která spočítá cenu včetně daně, původní atribut price obsahuje cenu bez daně.
  4. Ke třídě Customer vytvořte potomky UnregisteredCustomer a RegisteredCustomer:
    • Třída UnregisteredCustomer bude mít metodu register(), která vytvoří instanci RegisteredCustomer s úvodním počtem věrnostních bodů, hodnoty ostatních atributů budou přeneseny z původní instance.
    • Počet bodů, které zákazník po registraci získá bude dán konstantou REGISTRATION_LOYALTY_POINTS ve třídě RegisteredCustomer, dále vytvořte tamtéž konstantu LOYALTY_POINTS_COEF.
    • Ve třídě RegisteredCustomer vytvořte atribut loyaltyPoints.
    • Zařiďte, aby třídu Customer nebylo možné instancovat, naopak zařiďte, aby třídy UnregisteredCustomer a RegisteredCustomer již nemohli mít potomky.
  5. Ve třídě Order vytvořte metodu doOrder(), která dokončí objednávku
    • nastaví datum ordered,
    • pokud objednávku vytvořil registrovaný zákazník, zvýší počet jeho věrnostních bodů podle vzorce celková cena objednávky vč. daně * koeficient. Hodnota koeficientu bude dána konstantou LOYALTY_POINTS_COEF.

Domácí úkol