Treytlarin PHP-də OOP-də istifadəsi

Artıq bildiyiniz kimi, PHP-də bir neçə klasdan bir anda miras almaq mümkün deyil, yalnız birindən. Biz artıq bu problemin həllini keçmişdik: miras almaq əvəzinə digər klasların obyektlərindən istifadə etmək.

PHP-də başqa bir üsul da var. Bu üsul treytlər istifadə etməkdir. Treyt digər klaslara əlavə edilə bilən xassələr və metodlar toplusudur. Bu zaman treytin xassələri və metodları klas tərəfindən öz kimi qəbul edilir.

Treytin sintaksisi klasla eynidir, istisna olaraq treytin adı trait açar sözü ilə elan edilməlidir.

Treytin nümunəsini yaratmaq mümkün deyil - treytlər yalnız digər klaslara qoşulmaq üçün nəzərdə tutulub. Özü qoşulma use əmri ilə həyata keçirilir, ondan sonra boşluqla qoşulan treytin adı göstərilir. Bu əmr klasın əvvəlində yazılır.

Gəlin treytlərin tətbiqini praktiki misalda nəzərdən keçirək. Tutaq ki, bizdə Helper treyti verilib, hansı ki, name və age private xassələrini və onların getterlərini ehtiva edir:

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

Tutaq ki, bizdə həmçinin User klası var, onun konstruktorunda name və age xassələri təyin edilib:

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

Gəlin indi User klasımızın xassələri üçün getterlər əlavə edək. Ancaq onları birbaşa klasın özündə yazmayaq, sadəcə artıq bu metodların reallaşdığı Helper treytini qoşaq:

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

Treyt qoşulduqdan sonra klasımızda həmin treytin metodları və xassələri peyda olacaq. Bu zaman biz onlara klasın öz metodları və xassələri kimi müraciət edə biləcəyik:

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

name, age, population xassələri və onlar üçün getterlər olan City klasını reallaşdırın. Qoy klasımız öz kodunu qısaltmaq üçün artıq yaratdığımız Helper treytindən istifadə etsin.