Traits em OOP em PHP

Como você já sabe, em PHP não é possível herdar de várias classes ao mesmo tempo, apenas de uma. Anteriormente, já passamos pela solução para esse problema: em vez de herança, usar objetos de algumas classes dentro de outras.

No PHP, existe outra maneira. Ela consiste no uso de traits. Um trait representa um conjunto de propriedades e métodos que podem ser incluídos em outra classe. Nesse caso, as propriedades e métodos do trait serão percebidos pela classe como se fossem seus.

A sintaxe de um trait é a mesma de uma classe, exceto que o nome do trait precisa ser declarado usando a palavra-chave trait.

Não é possível criar uma instância de um trait - os traits são destinados apenas para conexão a outras classes. A própria conexão é realizada com o comando use, após o qual é indicado, separado por um espaço, o nome do trait a ser conectado. Este comando é escrito no início da classe.

Vamos ver a aplicação de traits em um exemplo prático. Suponha que tenhamos o seguinte trait Helper, contendo as propriedades privadas name e age, bem como seus getters:

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

Suponha que também tenhamos a seguinte classe User, em cujo construtor são definidas as propriedades name e age:

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

Agora, vamos adicionar os getters para as propriedades de nossa classe User. Só que não vamos escrevê-los na própria classe, mas simplesmente conectar o trait Helper, no qual esses métodos já estão implementados:

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

Após a conexão do trait, em nossa classe aparecerão os métodos e propriedades desse trait. Nesse caso, vamos nos referir a eles como se fossem métodos e propriedades da própria classe:

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

Implemente a classe City com as propriedades name, age, population e os getters para elas. Suponha que nossa classe para encurtar seu código use o trait Helper já criado por nós.