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.
- Classes and Objects,
- Doporučení pro psaní kódu:
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
- Vytvořte jmenný prostor
Model
a všechny modelové třídy do něj umístěte. Upravte autoloader tak, aby podporoval jmenné prostory. - Vytvořte trait pro generování unikátního ID – včetně atributu
id
, metodygetId
. 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. - Ve třídě
Product
vytvořte atributvatRate
pro sazbu daně. Vytvořte metodugetPriceVat()
, která spočítá cenu včetně daně, původní atributprice
obsahuje cenu bez daně. - Ke třídě
Customer
vytvořte potomkyUnregisteredCustomer
aRegisteredCustomer
:- Třída
UnregisteredCustomer
bude mít metoduregister()
, která vytvoří instanciRegisteredCustomer
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éž konstantuLOYALTY_POINTS_COEF
. - Ve třídě
RegisteredCustomer
vytvořte atributloyaltyPoints
. - Zařiďte, aby třídu
Customer
nebylo možné instancovat, naopak zařiďte, aby třídyUnregisteredCustomer
aRegisteredCustomer
již nemohli mít potomky.
- Třída
- Ve třídě
Order
vytvořte metodudoOrder()
, 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
.
- nastaví datum