Tema 7 · Interfaces & Contratos

Interfaces (interface): Contratos Fuertes, Desacoplamiento y Multi-implementación

Aprende a diseñar contratos de software con la palabra clave interface, implementa múltiples interfaces en una misma clase y desacopla tus servicios.

¿Qué es una Interfaz en PHP?

Una interfaz (declarada con la palabra reservada interface) es un contrato de software 100% puro. Define qué métodos debe tener una clase, pero no contiene ni una sola línea de código sobre cómo deben ejecutarse.

Piensa en los enchufes eléctricos de tu casa: el tomacorriente de la pared define una interfaz estándar (dos clavijas a 110V o 220V). No le importa si enchufas una cafetera, un televisor o una computadora; mientras el dispositivo cumpla con la interfaz del enchufe, la energía fluirá a la perfección.

Diagrama de Desacoplamiento mediante Interfaces

Diagrama de Interfaces e Inyección de Dependencias en PHP

Figura 7.1: Los servicios de alto nivel dependen de contratos (interfaces), permitiendo cambiar de proveedor sin reescribir la lógica.

Multi-implementación: Superando la Herencia Simple

En PHP, una clase solo puede heredar de un único padre mediante extends (no existe la herencia múltiple de clases).

Sin embargo, una misma clase puede cumplir y firmar múltiples contratos a la vez separándolos por comas mediante implements:

class Factura implements Imprimible, ExportableJson, NotificableEmail {
    // La clase debe implementar TODOS los métodos exigidos por las 3 interfaces
}

⚡ Pasarelas de Pago Desacopladas con PasarelaPagoInterface

Ejecuta el código en el Sandbox y observa cómo CheckoutService cobra con Stripe o PayPal de forma transparente:

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

// 1. Contrato: Interfaz de Pago
interface PasarelaPagoInterface
{
    public function cobrar(float $monto): bool;
    public function getNombre(): string;
}

// 2. Implementación A: Stripe
final class StripePasarela implements PasarelaPagoInterface
{
    public function getNombre(): string
    {
        return "Stripe Credit Card Gateway";
    }

    public function cobrar(float $monto): bool
    {
        echo "<p style='color:#6366f1;'>💳 Conectando con Stripe API... Cobro de $" . number_format($monto, 2) . " procesado con token cifrado.</p>";
        return true;
    }
}

// 3. Implementación B: PayPal
final class PayPalPasarela implements PasarelaPagoInterface
{
    public function getNombre(): string
    {
        return "PayPal Express Checkout";
    }

    public function cobrar(float $monto): bool
    {
        echo "<p style='color:#0284c7;'>🅿️ Redirigiendo a PayPal Orders... Autorización de $" . number_format($monto, 2) . " aprobada.</p>";
        return true;
    }
}

// 4. Implementación C: Mock Fake para Pruebas Unitarias de Clase
final class FakeMockPasarela implements PasarelaPagoInterface
{
    public function getNombre(): string
    {
        return "Mock Testing Gateway (Sin Dinero Real)";
    }

    public function cobrar(float $monto): bool
    {
        echo "<p style='color:#10b981;'>🧪 Simulación de cobro exitoso para tests unitarios: $" . number_format($monto, 2) . "</p>";
        return true;
    }
}

// 5. Servicio de Facturación Desacoplado (Inversión de Dependencias)
final class CheckoutService
{
    // Solo depende de la INTERFAZ, no de una empresa en particular
    public function __construct(
        private PasarelaPagoInterface $pasarela
    ) {}

    public function procesarPedido(string $cliente, float $total): void
    {
        echo "<h4>Procesando pedido para {$cliente} mediante: <em>{$this->pasarela->getNombre()}</em></h4>";
        $exito = $this->pasarela->cobrar($total);
        if ($exito) {
            echo "<p style='font-weight:bold; color:#16a34a;'> Pedido confirmado y factura generada con éxito.</p><hr>";
        }
    }
}

// ==========================================
// PRUEBA EN EL SANDBOX
// ==========================================
// Caso 1: Cliente paga con Stripe
$checkoutStripe = new CheckoutService(new StripePasarela());
$checkoutStripe->procesarPedido("Sofía Morales", 149.99);

// Caso 2: Cliente prefiere PayPal
$checkoutPayPal = new CheckoutService(new PayPalPasarela());
$checkoutPayPal->procesarPedido("David Peña", 75.50);

// Caso 3: Pruebas automatizadas en desarrollo
$checkoutTest = new CheckoutService(new FakeMockPasarela());
$checkoutTest->procesarPedido("Usuario Pruebas", 10.00);
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
¿Cuántas interfaces puede implementar una misma clase en PHP mediante la palabra clave "implements"?
🦉
¿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.