Traitit OOP:ssa PHP:ssä
Kuten jo tiedät, PHP:ssä ei voi periä useasta luokasta kerralla, vain yhdestä. Aikaisemmin olemme jo käsitelleet ratkaisua tähän ongelmaan: perinnän sijasta käytetään objektia yhteen luokkaan toisten sisällä.
PHP:ssä on toinen tapa. Se perustuu traitien käyttöön. Trait edustaa ominaisuuksien ja menetelmien kokoelmaa, jotka voidaan liittää toiseen luokkaan. Tällöin ominaisuudet ja traitin menetelmät koetaan luokassa ikään kuin omikseen.
Traitin syntaksi on sama kuin luokalla,
poikkeuksena, että traitin nimi on
ilmoitettava avainsanalla
trait.
Traitista ei voi luoda instanssia - traitit
on tarkoitettu vain liitettäväksi toisiin
luokkiin. Itse liittäminen toteutetaan
komennolla use, jonka jälkeen
välilyönnillä erotettuna ilmoitetaan liitettävän
traitin nimi. Tämä komento kirjoitetaan luokan alkuun.
Katsotaan traitien käyttöä käytännön
esimerkissä. Oletetaan, että meillä on seuraava trait
Helper, joka sisältää yksityiset ominaisuudet
name ja age, sekä niiden getterit:
<?php
trait Helper
{
private $name;
private $age;
public function getName()
{
return $this->name;
}
public function getAge()
{
return $this->age;
}
}
?>
Oletetaan, että meillä on myös seuraava luokka User,
jonka konstruktorissa asetetaan ominaisuudet
name ja age:
<?php
class User
{
public function __construct($name, $age)
{
$this->name = $name;
$this->age = $age;
}
}
?>
Lisätään nyt getterit luokkamme User ominaisuuksille.
Mutta älkäämme
kirjoittako niitä itse luokkaan, vaan yksinkertaisesti liitetään
trait Helper, jossa nämä menetelmät
on jo toteutettu:
<?php
class User
{
use Helper; // liitetään trait
public function __construct($name, $age)
{
$this->name = $name;
$this->age = $age;
}
}
?>
Traitin liittämisen jälkeen luokkaamme ilmestyvät traitin menetelmät ja ominaisuudet. Tällöin viittaamme niihin ikään kuin ne olisivat luokan omia menetelmiä ja ominaisuuksia:
<?php
$user = new User('john', 30);
echo $user->getName(); // tulostaa 'john'
echo $user->getAge(); // tulostaa 30
?>
Toteuta luokka City, jossa on ominaisuudet
name, age, population
ja getterit niille. Olkoon luokkamme
lyhentääkseen koodiaan käyttää jo luomaamme
traitia Helper.