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:

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

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

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

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

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.