1
<?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);
Haz clic para editar este código