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:
<?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:
<?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é:
<?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:
<?php
$user = new User('john', 30);
echo $user->getName(); // vypíše 'john'
echo $user->getAge(); // vypíše 30
?>
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.