Inicio » Blog » Traits en PHP

Traits en PHP: ¡Reutiliza código como un mago!

Bienvenido a una nueva lección de nuestro curso básico de PHP 8. Hoy nos metemos con los traits, una herramienta genial de la programación orientada a objetos (POO) que te permite compartir métodos entre clases sin complicaciones. Si ya manejas namespaces y herencia, esto es como un superpoder para evitar repetirte. Todo va a ser claro, práctico y con ejemplos que te van a flipar. ¡Empecemos!

¿Qué son los traits?

Un trait es como una caja de herramientas: contiene métodos que puedes «pegar» en cualquier clase para reutilizarlos, sin necesidad de herencia múltiple (que PHP no permite). Es una forma flexible de compartir código entre clases que no están relacionadas, manteniendo todo modular y limpio.

Características clave:

  • No se instancian: No puedes hacer new MiTrait().
  • Solo métodos (y propiedades): Suelen tener métodos, pero también pueden incluir propiedades.
  • Uso con use: Lo «importas» dentro de una clase para usar sus métodos.
  • Solución a la herencia simple: Como PHP no deja heredar de varias clases, los traits son la alternativa.

La receta básica en PHP es esta:

trait MiTrait {
    public function metodoCompartido() {
        // Código reusable
    }
}

class MiClase {
    use MiTrait; // ¡Magia! Ahora tiene metodoCompartido()
}

Probando traits en acción

¡Manos a la obra! Crea un archivo traits.php en curso_php8 (dentro de C:\xampp\htdocs) y prueba esto:

Ejemplo 1: Trait con libros

<?php
    class Libro {
        public function titulo($nombre) {
            echo "Libro: $nombre<br>";
        }
    }

    trait LibrosBiograficos {
        public function descripcionBiografica() {
            echo "Contiene la vida de una persona<br>";
        }
    }

    class Lector extends Libro {
        use LibrosBiograficos;

        public function formato($formato) {
            echo "Formato: $formato<br>";
        }
    }

    $libro = new Lector();
    $libro->titulo("Steve Jobs");
    $libro->descripcionBiografica();
    $libro->formato("Electrónico");
?>

Abre http://localhost/curso_php8/traits.php. Verás:

Libro: Steve Jobs
Contiene la vida de una persona
Formato: Electrónico

¿Qué pasó?

  • Libro tiene un método básico.
  • El trait LibrosBiograficos aporta un método reutilizable.
  • Lector hereda de Libro y usa el trait con use, combinando todo.
  • El objeto $libro accede a métodos de la clase, la clase padre y el trait.

Ejemplo práctico

Ejemplo: Trait para dispositivos

<?php
    trait Bateria {
        public function nivelBateria($porcentaje) {
            echo "Nivel de batería: $porcentaje%<br>";
        }
    }

    class Telefono {
        use Bateria;

        public function llamar() {
            echo "Haciendo una llamada...<br>";
        }
    }

    class Tableta {
        use Bateria;

        public function navegar() {
            echo "Navegando en internet...<br>";
        }
    }

    $telefono = new Telefono();
    $tableta = new Tableta();

    $telefono->llamar();
    $telefono->nivelBateria(80);
    $tableta->navegar();
    $tableta->nivelBateria(50);
?>

Resultado:

Haciendo una llamada...
Nivel de batería: 80%
Navegando en internet...
Nivel de batería: 50%

¿Qué pasó?

  • El trait Bateria comparte el método nivelBateria().
  • Telefono y Tableta lo usan sin estar relacionados por herencia.
  • Cada clase tiene sus propios métodos, pero comparten el del trait.

Ejercicio para practicar

¡Tu turno! Ve a curso_php8 y prueba este reto:

  1. Trait de Geolocalización
    Crea geolocalizacion.php:
<?php
       trait Geolocalizacion {
           public function obtenerUbicacion() {
               return "Ubicación: Lat 40.7128, Lon -74.0060";
           }

           public function calcularDistancia($lat1, $lon1, $lat2, $lon2) {
               $distancia = sqrt(pow($lat2 - $lat1, 2) + pow($lon2 - $lon1, 2));
               return "Distancia: $distancia unidades";
           }
       }

       class Ciudad {
           use Geolocalizacion;

           public function describir() {
               echo "Explorando la ciudad...<br>";
           }
       }

       class Vehiculo {
           use Geolocalizacion;

           public function viajar() {
               echo "Viajando por la ruta...<br>";
           }
       }

       $ciudad = new Ciudad();
       $vehiculo = new Vehiculo();

       echo $ciudad->obtenerUbicacion() . "<br>";
       $ciudad->describir();
       echo $ciudad->calcularDistancia(40.71, -74.00, 40.73, -74.02) . "<br>";

       echo $vehiculo->obtenerUbicacion() . "<br>";
       $vehiculo->viajar();
       echo $vehiculo->calcularDistancia(40.71, -74.00, 40.73, -74.02) . "<br>";
   ?>

Ejecuta en localhost/curso_php8/ y juega con los valores.

Consejos para no enredarte

  • No son clases: No intentes instanciar un trait; solo es un contenedor de métodos.
  • Prioridad clara: Si un método está en la clase, el trait o la clase padre, la clase gana, luego el trait, y最后 la padre.
  • Múltiples traits: Puedes usar varios con use Trait1, Trait2;.
  • Nombres específicos: Usa nombres de traits que indiquen su propósito (como Geolocalizacion).

¡A por más POO!

¡Gran trabajo! Ahora los traits son tu varita mágica para compartir código sin repetirte. En la próxima lección, veremos excepciones para manejar errores como pros. Si algo no te queda claro, déjame un comentario.

Lo que aprendiste hoy:

  • Qué son: Contenedores de métodos para reutilizar sin herencia múltiple.
  • use en clases: La clave para importar métodos de un trait.
  • Ejemplos vivos: Hiciste libros y dispositivos con traits como crack.
  • Practicaste: Creaste geolocalización compartida como pro.
  • Tip del pro: Usa traits para código que varias clases necesitan, pero no abuses para no complicar.

Deja un comentario

Scroll al inicio