Traity v OOP v PHP
Jak již víte, v PHP nelze dědit z více tříd najednou, pouze z jedné. Dříve jsme již probírali řešení tohoto problému: místo dědičnosti používat objekty jedněch tříd uvnitř jiných.
V PHP existuje i jiný způsob. Spočívá v použití traitů. Trait představuje soubor vlastností a metod, které lze zahrnout do jiné třídy. Přitom vlastnosti a metody traitu budou třídou vnímány jako by byly její vlastní.
Syntaxe traitu je stejná jako u třídy,
s výjimkou toho, že název traitu je třeba
deklarovat pomocí klíčového
slova trait.
Instanci traitu nelze vytvořit - traity
jsou určeny pouze pro připojení k jiným
třídám. Samotné připojení se provádí
pomocí příkazu use, za kterým
je mezerou uveden název připojovaného
traitu. Tento příkaz se píše na začátku třídy.
Podívejme se na použití traitů na praktickém
příkladu. Předpokládejme, že máme daný tento trait
Helper, obsahující privátní vlastnosti
name a age, a také jejich gettery:
<?php
trait Helper
{
private $name;
private $age;
public function getName()
{
return $this->name;
}
public function getAge()
{
return $this->age;
}
}
?>
Předpokládejme, že máme také tuto třídu User,
v jejímž konstruktoru jsou nastaveny vlastnosti
name a age:
<?php
class User
{
public function __construct($name, $age)
{
$this->name = $name;
$this->age = $age;
}
}
?>
Nyní přidejme gettery pro vlastnosti
naší třídy User. Ale nezapisujme je
přímo do třídy, místo toho pouze připojme
trait Helper, ve kterém jsou tyto metody
již implementovány:
<?php
class User
{
use Helper; // připojujeme trait
public function __construct($name, $age)
{
$this->name = $name;
$this->age = $age;
}
}
?>
Po připojení traitu se v naší třídě objeví metody a vlastnosti tohoto traitu. Přitom k nim budeme přistupovat, jako by to byly metody a vlastnosti samotné třídy:
<?php
$user = new User('john', 30);
echo $user->getName(); // vypíše 'john'
echo $user->getAge(); // vypíše 30
?>
Implementujte třídu City s vlastnostmi
name, age, population
a gettery pro ně. Nechť naše třída pro
zkrácení svého kódu používá již vytvořený
trait Helper.