Inicio > Cursos > PHP > Herencia, Interfaces y Traits
PHPPOO y PHP ModernoLección 10 de 15

Herencia, Interfaces y Traits

La herencia en PHP (extends) permite que una clase hija reutilice todo el código de la clase padre y lo extienda. Una clase puede implementar múltiples interfaces con implements, definiendo contratos que la clase debe cumplir. Los traits son una característica única de PHP: permiten "mezclar" código de múltiples orígenes en una clase sin herencia formal.

Un trait es como un fragmento de código reutilizable que puedes incluir en múltiples clases con use NombreTrait.

Las interfaces en PHP definen contratos de métodos que las clases implementadoras deben tener. Son fundamentales en frameworks como Laravel para la inyección de dependencias y el testing: en lugar de depender de una clase concreta, dependes de una interfaz, y puedes sustituir la implementación en tests.

Los traits resuelven problemas donde varias clases no relacionadas necesitan el mismo comportamiento (como Timestamps para registrar cuándo se creó/actualizó un objeto) sin crear una jerarquía forzada.

<?php
// Clase abstracta
abstract class Animal {
    public function __construct(
        protected string $nombre
    ) {}
    
    abstract public function hacerSonido(): string;
    
    public function describir(): void {
        echo "Soy {$this->nombre}: {$this->hacerSonido()}\n";
    }
}

// Herencia con override
class Perro extends Animal {
    public function __construct(
        string $nombre,
        private string $raza
    ) {
        parent::__construct($nombre);
    }
    
    public function hacerSonido(): string { return "¡Woof!"; }
}

// Interfaz
interface Serializable {
    public function toArray(): array;
    public function toJson(): string;
}

interface Cacheable {
    public function getCacheKey(): string;
}

// Clase con múltiples interfaces
class Usuario extends Animal implements Serializable, Cacheable {
    public function hacerSonido(): string { return "Hola"; }
    public function toArray(): array { return ["nombre" => $this->nombre]; }
    public function toJson(): string { return json_encode($this->toArray()); }
    public function getCacheKey(): string { return "user:{$this->nombre}"; }
}

// Trait - reutilización sin herencia
trait Timestamps {
    private ?\DateTime $createdAt = null;
    
    public function setCreatedAt(): void {
        $this->createdAt = new \DateTime();
    }
    
    public function getCreatedAt(): string {
        return $this->createdAt?->format("Y-m-d") ?? "No establecido";
    }
}

trait SoftDelete {
    private ?\DateTime $deletedAt = null;
    
    public function delete(): void { $this->deletedAt = new \DateTime(); }
    public function isDeleted(): bool { return $this->deletedAt !== null; }
}

class Producto {
    use Timestamps, SoftDelete;
    
    public function __construct(public string $nombre) {
        $this->setCreatedAt();
    }
}
Consejo🔧 Los Traits son la solución de PHP para compartir código entre clases sin herencia. Son como "mixins" que puedes añadir a cualquier clase con use.
← Clases y ObjetosBases de Datos con PDO →

Practica esta lección

Resuelve los ejercicios del curso de PHP en la app, gratis y con corrección automática.

Empezar a practicar