Trait-et në OOP në PHP

Siç e dini tashmë, në PHP nuk mund të trashëgoni nga disa klasa njëherësh, vetëm nga një. Më parë kemi kaluar tashmë zgjidhjen e këtij problemi: në vend të trashëgimisë përdorni objekte të një klase brenda klasave të tjera.

Në PHP ekziston një mënyrë tjetër. Ajo qëndron në përdorimin e trait-eve. Një trait përfaqëson një grup vetish dhe metodash që mund të përfshihen në një klasë tjetër. Në këtë rast vetitë dhe metodat e trait-it do të perceptohen nga klasa sikur të ishin të veta.

Sintaksa e një trait-i është e njëjtë me atë të klasës, përveç se emri i trait-it duhet të deklarohet duke përdorur fjalën kyçe trait.

Nuk mund të krijohet një instancë e një trait-i - trait-et shërbejnë vetëm për t'u lidhur me klasa të tjera. Vetë lidhja kryhet me komandën use, pas së cilës përmendet emri i trait-it që do të lidhet. Kjo komandë shkruhet në fillim të klasës.

Le të shohim zbatimin e trait-eve në një shembull praktik. Le të themi se kemi trait-in e mëposhtëm Helper, i cili përmban vetitë private name dhe age, si dhe getter-at e tyre:

Helper.php<?php
  trait Helper
  {
    private $name;
    private $age;
    
    public function getName()
    {
      return $this->name;
    }
    
    public function getAge()
    {
      return $this->age;
    }
  }
?>

Le të themi se kemi edhe klasën e mëposhtme User, në konstruktorin e së cilës përcaktohen vetitë name dhe age:

User.php<?php
  class User
  {
    public function __construct($name, $age)
    {
      $this->name = $name;
      $this->age = $age;
    }
  }
?>

Tani le të shtojmë getter për vetitë e klasës sonë User. Por mos i shkruajmë ato brenda vetë klasës, thjesht le ta lidhim trait-in Helper, në të cilin këto metoda janë implementuar tashmë:

User.php<?php
  class User
  {
    use Helper; // lidhim trait-in
    
    public function __construct($name, $age)
    {
      $this->name = $name;
      $this->age = $age;
    }
  }
?>

Pas lidhjes së trait-it, në klasën tonë do të shfaqen metodat dhe vetitë e këtij trait-i. Në këtë rast ne do t'u drejtohemi atyre sikur të ishin metoda dhe veti të klasës vetë:

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

Implementoni klasën City me vetitë name, age, population dhe getter-at për to. Le të themi se klasa jonë për të shkurtuar kodin e saj përdor trait-in Helper që kemi krijuar tashmë.