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:

Helper.php<?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:

User.php<?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:

User.php<?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:

index.php<?php
  $user = new User('john', 30);
  echo $user->getName(); // tulostaa 'john'
  echo $user->getAge();  // tulostaa 30
?>
Задание 1

Toteuta luokka City, jossa on ominaisuudet name, age, population ja getterit niille. Olkoon luokkamme lyhentääkseen koodiaan käyttää jo luomaamme traitia Helper.