Трэйты ў ААП у PHP

Як вы ўжо ведаеце, у PHP нельга наследоваць ад некалькіх класаў адразу, толькі ад аднаго. Раней мы ўжо праходзілі рашэнне гэтай праблемы: замест наследавання выкарыстоўваць аб'екты адных класаў унутры іншых.

У PHP ёсць і іншы спосаб. Ён заключаецца ў выкарыстанні трэйтаў. Трэйт уяўляе сабой набор уласцівасцей і метадаў, якія можна ўключыць у іншы клас. Пры гэтым уласцівасці і метады трэйта будуць успрымацца класам быццам свае.

Сінтаксіс трэйта такі ж як і ў класа, за выключэннем таго, што імя трэйта трэба аб'яўляць з дапамогай ключавога слова trait.

Экземпляр трэйта нельга стварыць - трэйты прызначаны толькі для падлучэння да іншых класаў. Само падлучэнне ажыццяўляецца з дапамогай каманды use, пасля якой праз прабел паказваецца імя падлучаемага трэйта. Даная каманда пішацца ў пачатку класа.

Давайце паглядзім прымяненне трэйтаў на практычным прыкладзе. Хай у нас даны вось такі трэйт Helper, які змяшчае прыватныя ўласцівасці name і age, а таксама іх гетэры:

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

Хай у нас таксама ёсць вось такі клас User, у канструктары якога задаюцца ўласцівасці name і age:

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

Давайце цяпер дадамо гетэры для ўласцівасцей нашага класа User. Toлькі не будзем іх запісваць у самым класе, а проста падключым трэйт Helper, у якім гэтыя метады ўжо рэалізаваны:

User.php<?php
  class User
  {
    use Helper; // падключаем трэйт
    
    public function __construct($name, $age)
    {
      $this->name = $name;
      $this->age = $age;
    }
  }
?>

Пасля падлучэння трэйта ў нашым класе з'явяцца метады і ўласцівасці гэтага трэйта. Пры гэтым звяртацца мы да іх будзем быццам да метадаў і ўласцівасцей самога класа:

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

Рэалізуйце клас City з уласцівасцямі name, age, population і гетэрамі для іх. Хай наш клас для скарачэння свайго кода выкарыстоўвае ўжо створаны нами трэйт Helper.