Traity v OOP v PHP

Ako už viete, v PHP nie je možné dediť od viacerých tried naraz, iba od jednej. Predtým sme už prešli riešenie tohto problému: namiesto dedenia používať objekty jedných tried v iných.

V PHP existuje aj iný spôsob. Spočíva v použití traitov. Trait predstavuje súbor vlastností a metód, ktoré je možné zahrnúť do inej triedy. Pričom vlastnosti a metódy traitu budú triedou vnímané ako vlastné.

Syntax traitu je rovnaký ako u triedy, s výnimkou toho, že názov traitu je potrebné deklarovať pomocou kľúčového slova trait.

Inštanciu traitu nie je možné vytvoriť - traity sú určené len na pripojenie k iným triedam. Samotné pripojenie sa vykonáva pomocou príkazu use, za ktorým cez medzeru je uvedený názov pripájaného traitu. Tento príkaz sa píše na začiatku triedy.

Pozrime sa na použitie traitov v praktickom príklade. Predpokladajme, že máme daný takýto trait Helper, obsahujúci privátne vlastnosti name a age, ako aj ich gettery:

Helper.php<?php
  trait Helper
  {
    private $name;
    private $age;
    
    public function getName()
    {
      return $this->name;
    }
    
    public function getAge()
    {
      return $this->age;
    }
  }
?>

Predpokladajme, že máme aj takúto triedu User, v ktorej konštruktore sú nastavené vlastnosti name a age:

User.php<?php
  class User
  {
    public function __construct($name, $age)
    {
      $this->name = $name;
      $this->age = $age;
    }
  }
?>

Pridajme teraz gettery pre vlastnosti našej triedy User. Len ich nebudeme zapisovať v samotnej triede, ale jednoducho pripojíme trait Helper, v ktorom sú tieto metódy už implementované:

User.php<?php
  class User
  {
    use Helper; // pripájame trait
    
    public function __construct($name, $age)
    {
      $this->name = $name;
      $this->age = $age;
    }
  }
?>

Po pripojení traitu sa v našej triede objavia metódy a vlastnosti tohto traitu. Pritom pristupovať k nim budeme ako k metódam a vlastnostiam samotnej triedy:

index.php<?php
  $user = new User('john', 30);
  echo $user->getName(); // vypíše 'john'
  echo $user->getAge();  // vypíše 30
?>
Задание 1

Implementujte triedu City s vlastnosťami name, age, population a gettermi pre ne. Nech naša trieda pre skrátenie svojho kódu používa už nami vytvorený trait Helper.