Traidid OOP-s PHP-s
Nagu te juba teate, PHP-s ei saa mitmest klassist korraga pärida, vaid ainult ühest. Varem oleme juba läbinud selle probleemi lahenduse: pärimise asemel kasutada ühe klassi objekte teiste klasside sees.
PHP-s on ka teine viis. See seisneb traitide kasutamises. Trait esindab omaduste ja meetodite kogumit, mida saab kaasata teise klassi. Sel juhul omadused ja trait'i meetodeid käsitletakse klassi poolt nagu omi.
Trait'i süntaks on sama mis klassil,
välja arvatud see, et trait'i nimi tuleb
deklareerida võtmesõnaga trait.
Trait'i eksemplari ei saa luua - trait'id on
mõeldud ainult teistesse klassidesse ühendamiseks.
Ühendamine toimub
käsuga use, mille järel
tühikuga eraldatuna märgitakse ühendatava
trait'i nimi. See käsk kirjutatakse klassi algusesse.
Vaatame trait'ide rakendamist praktilisel
näitel. Olgu meil antud selline trait
Helper, mis sisaldab privaatseid omadusi
name ja age, ning nende getter'eid:
<?php
trait Helper
{
private $name;
private $age;
public function getName()
{
return $this->name;
}
public function getAge()
{
return $this->age;
}
}
?>
Olgu meil ka selline klass User,
mille konstruktoris määratakse omadused
name ja age:
<?php
class User
{
public function __construct($name, $age)
{
$this->name = $name;
$this->age = $age;
}
}
?>
Lisame nüüd getter'id omaduste jaoks
meie klassis User. Ärme aga
kirjuta need klassi enda sisse, vaid lihtsalt ühendame
trait'i Helper, kus need meetodid
on juba realiseeritud:
<?php
class User
{
use Helper; // ühendame trait'i
public function __construct($name, $age)
{
$this->name = $name;
$this->age = $age;
}
}
?>
Pärast trait'i ühendamist ilmuvad meie klassi selle trait'i meetodid ja omadused. Pealegi pöördume me nende poole nagu klassi enda meetodite ja omaduste poole:
<?php
$user = new User('john', 30);
echo $user->getName(); // väljastab 'john'
echo $user->getAge(); // väljastab 30
?>
Realiseerige klass City omadustega
name, age, population
ja nende jaoks getter'itega. Olgu meie klass
oma koodi lühendamiseks kasutab juba meie poolt loodud
trait'i Helper.