Tema 15 · Principios SOLID

Principios SOLID en PHP: Los 5 Pilares del Código Limpio y Mantenible

Aprende los cinco principios de diseño orientado a objetos más respetados en la industria del software para crear arquitecturas limpias, modulares y profesionales.

¿Qué son los Principios SOLID?

Popularizados por el ingeniero Robert C. Martin ("Uncle Bob"), los principios S.O.L.I.D. representan el estándar de oro en la arquitectura de software orientada a objetos. Son la diferencia entre un código espagueti ilegible y una aplicación empresarial lista para producción.

Desglose de los 5 Principios SOLID

Letra Principio en Español Regla Práctica para el Desarrollador
S Single Responsibility (Responsabilidad Única) Una clase debe tener una sola razón para cambiar. No mezcles lógica de negocio con consultas a bases de datos ni con renderizado HTML.
O Open / Closed (Abierto / Cerrado) Las entidades deben estar abiertas a la extensión pero cerradas a la modificación. Añade nuevas funciones creando clases nuevas, no modificando código probado.
L Liskov Substitution (Sustitución de Liskov) Si una función espera una clase padre, debe poder recibir cualquiera de sus clases hijas sin romper el programa ni arrojar comportamientos inesperados.
I Interface Segregation (Segregación de Interfaces) Es preferible tener muchas interfaces pequeñas y específicas que una interfaz gigantesca llena de métodos que las clases no necesitan.
D Dependency Inversion (Inversión de Dependencias) Los módulos de alto nivel no deben depender de módulos de bajo nivel; ambos deben depender de abstracciones (interfaces).

⚡ Refactorización Limpia de un Sistema de Facturación aplicando SOLID

Ejecuta el código en el Sandbox y observa cómo cada clase tiene una única responsabilidad bien definida:

SolidDemo.php
Solo lectura
<?php
declare(strict_types=1);

// 1. [S] - Entidad de Negocio Pura (Solo gestiona los datos de la factura)
final class Factura
{
    public function __construct(
        public readonly string $codigo,
        public readonly string $cliente,
        public readonly float $subtotal,
        public readonly float $tasaIva = 0.19
    ) {}

    public function calcularTotal(): float
    {
        return round($this->subtotal * (1 + $this->tasaIva), 2);
    }
}

// 2. [I & D] - Interfaces Segregadas de Notificación y Persistencia
interface NotificadorFacturaInterface
{
    public function notificar(Factura $factura): void;
}

interface RepositorioFacturaInterface
{
    public function guardar(Factura $factura): bool;
}

// 3. [O] - Implementaciones Abiertas para Extender
final class EmailNotificador implements NotificadorFacturaInterface
{
    public function notificar(Factura $factura): void
    {
        echo "<p style='color:#0284c7;'>📧 Notificación enviada al cliente: <em>{$factura->cliente}</em> por la factura #{$factura->codigo}.</p>";
    }
}

final class BaseDatosRepositorio implements RepositorioFacturaInterface
{
    public function guardar(Factura $factura): bool
    {
        echo "<p style='color:#10b981;'>💾 Factura #{$factura->codigo} almacenada en tabla `facturas` con total de $" . number_format($factura->calcularTotal(), 2) . "</p>";
        return true;
    }
}

// 4. [D] - Servicio de Alto Nivel con Inversión de Dependencias
final class ProcesadorFacturas
{
    public function __construct(
        private RepositorioFacturaInterface $repo,
        private NotificadorFacturaInterface $notificador
    ) {}

    public function emitir(Factura $factura): void
    {
        $this->repo->guardar($factura);
        $this->notificador->notificar($factura);
        echo "<div style='background:#f0fdf4; border:1px solid #bbf7d0; padding:10px; border-radius:6px; color:#166534; font-weight:bold;'>✔ Ciclo de emisión SOLID completado exitosamente.</div><hr>";
    }
}

// ==========================================
// PRUEBA EN EL SANDBOX
// ==========================================
echo "<h2>Procesamiento de Facturación Arquitectura SOLID:</h2>";

// Inyección de componentes modulares
$procesador = new ProcesadorFacturas(
    new BaseDatosRepositorio(),
    new EmailNotificador()
);

$factura1 = new Factura("FAC-2026-001", "Acme Corporation", 1200.00);
$factura2 = new Factura("FAC-2026-002", "Kilopolis Tech Hub", 450.00);

$procesador->emitir($factura1);
$procesador->emitir($factura2);
Pruébalo tú mismo » Se abre en una nueva pestaña con ejecución en vivo
🧠
Mini-Quiz de Retención
Comprueba tu comprensión antes de pasar a la siguiente lección
1 Pregunta
Pregunta 1
¿Qué establece el Principio de Responsabilidad Única (Single Responsibility Principle) en el acrónimo SOLID?
🦉
¿Tienes dudas con este tema?
Sócrates AI puede darte analogías y explicarte este código paso a paso.

🚀 ¿Quieres dominar Manual de Programación Orientada a Objetos en PHP (POO) y crear proyectos reales?

Aprende arquitectura limpia, desarrollo web moderno, buenas prácticas y despliegue en producción con nuestro Bootcamp Fullstack Developer con mentorías en vivo.

🏛️ Autoría y Propiedad Intelectual: Obra educativa original de David Amador para Kilopolis Academia (Solucionáticos), estructurada sobre las especificaciones y estándares abiertos del W3C, el estándar vivo de WHATWG y la documentación oficial de código abierto. © Todos los derechos reservados.