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:
<?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);
Mini-Quiz de Retención
Comprueba tu comprensión antes de pasar a la siguiente lección¿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.