Трейтове в ООП в 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. Само че няма да ги записваме в самия клас, а просто ще свържем трейта 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.