Traits en POO en PHP

Como ya sabes, en PHP no se puede heredar de varias clases a la vez, solo de una. Anteriormente, ya hemos visto una solución a este problema: en lugar de herencia, utilizar objetos de unas clases dentro de otras.

En PHP existe otra forma. Consiste en el uso de traits. Un trait representa un conjunto de propiedades y métodos que se pueden incluir en otra clase. En este caso, las propiedades y métodos del trait serán percibidos por la clase como si fueran propios.

La sintaxis de un trait es la misma que la de una clase, excepto que el nombre del trait se debe declarar usando la palabra clave trait.

No se puede crear una instancia de un trait - los traits están destinados solo para ser conectados a otras clases. La conexión en sí se realiza con el comando use, después de la cual separado por un espacio se indica el nombre del trait a conectar. Este comando se escribe al principio de la clase.

Veamos la aplicación de los traits con un ejemplo práctico. Supongamos que tenemos este trait Helper, que contiene las propiedades privadas name y age, así como sus getters:

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

Supongamos que también tenemos esta clase User, en cuyo constructor se establecen las propiedades name y age:

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

Ahora agreguemos los getters para las propiedades de nuestra clase User. Solo que no vamos a escribirlos en la clase misma, sino que simplemente conectaremos el trait Helper, donde estos métodos ya están implementados:

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

Después de conectar el trait, en nuestra clase aparecerán los métodos y propiedades de este trait. Además, nos referiremos a ellos como si fueran métodos y propiedades de la clase misma:

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

Implemente la clase City con las propiedades name, age, population y sus getters. Que nuestra clase para acortar su código use el trait Helper que ya hemos creado.