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:
<?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:
<?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:
<?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:
<?php
$user = new User('john', 30);
echo $user->getName(); // mostrará 'john'
echo $user->getAge(); // mostrará 30
?>
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.