Trejti u OOP u PHP
Kao što već znate, u PHP-u ne možete naslediti od više klasa istovremeno, samo od jedne. Ranije smo već prolazili kroz rešenje ovog problema: umesto nasleđivanja koristiti objekte jednih klasa unutar drugih.
U PHP-u postoji i drugi način. On se sastoji u korišćenju trejtova. Trejt predstavlja skup svojstava i metoda koji se mogu uključiti u drugu klasu. Pri tome svojstva i metode trejta će se od strane klase doživljavati kao sopstveni.
Sintaksa trejta je ista kao i kod klase,
izuzev što ime trejta treba
deklarisati pomoću ključne
reči trait.
Instancu trejta ne možete kreirati - trejtovi
su namenjeni samo za povezivanje sa drugim
klasama. Samo povezivanje se vrši
pomoću komande use, nakon koje
se razmakom navodi ime trejta za povezivanje.
Ova komanda se piše na početku klase.
Hajde da pogledamo primenu trejtova na praktičnom
primeru. Neka nam je dat ovakav trejt
Helper, koji sadrži privatna svojstva
name i age, kao i njihove getere:
<?php
trait Helper
{
private $name;
private $age;
public function getName()
{
return $this->name;
}
public function getAge()
{
return $this->age;
}
}
?>
Neka imamo i ovakvu klasu User,
u čijem konstruktoru se postavljaju svojstva
name i age:
<?php
class User
{
public function __construct($name, $age)
{
$this->name = $name;
$this->age = $age;
}
}
?>
Hajde sada da dodamo getere za svojstva
naše klase User. Samo nećemo
ih zapisati u samoj klasi, već ćemo jednostavno povezati
trejt Helper, u kome su ove metode
već implementirane:
<?php
class User
{
use Helper; // povezujemo trejt
public function __construct($name, $age)
{
$this->name = $name;
$this->age = $age;
}
}
?>
Nakon povezivanja trejta u našoj klasi će se pojaviti metode i svojstva ovog trejta. Pritom obraćaćemo im se kao metodama i svojstvima same klase:
<?php
$user = new User('john', 30);
echo $user->getName(); // ispisaće 'john'
echo $user->getAge(); // ispisaće 30
?>
Implementirajte klasu City sa svojstvima
name, age, population
i geterima za njih. Neka naša klasa za
skraćivanje svog koda koristi već kreirani
trejt Helper.