Tema 5 · Polimorfismo

Polimorfismo: Despacho Dinámico y Eliminación de Condicionales if/switch

Aprende a diseñar sistemas desacoplados donde múltiples clases responden a un mismo método de formas diferentes, eliminando condicionales complejos.

¿Qué es el Polimorfismo?

Etimológicamente, polimorfismo significa "múltiples formas". En la Programación Orientada a Objetos, es la capacidad que tienen objetos de diferentes clases para responder a un mismo mensaje o método con comportamientos específicos propios.

En la vida real, si le dices a un músico: "Toca tu instrumento":

  • El guitarrista pulsará las cuerdas de su guitarra.
  • El pianista presionará las teclas de su piano.
  • El baterista golpeará sus tambores.

La orden fue exactamente la misma (tocar()), pero cada músico ejecutó una acción diferente según su naturaleza.

El Anti-Patrón que el Polimorfismo Erradica

Sin polimorfismo, los programadores suelen escribir código frágil repleto de condicionales switch:

// ❌ CÓDIGO FRÁGIL (Sin Polimorfismo)
function enviarAlerta($usuario, $tipo, $mensaje) {
    switch ($tipo) {
        case 'email':    /* 40 líneas de cURL o mail() */ break;
        case 'sms':      /* 30 líneas de Twilio API */ break;
        case 'whatsapp': /* 50 líneas de Meta Graph API */ break;
        // Si agregamos Telegram, ¡tenemos que modificar este archivo arriesgando romper producción!
    }
}
Con Polimorfismo: Cada canal es una clase independiente con su propio método enviar(). Tu servicio principal solo recibe un objeto Notificador y llama a $canal->enviar($mensaje). Agregar Telegram solo requiere crear una clase nueva sin tocar una sola línea de código existente.

⚡ Sistema de Notificaciones Multicanal Polimórfico en PHP

Ejecuta el código en el Sandbox y observa cómo una sola función despacha alertas sin importar el canal:

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

// 1. Clase Base de Notificación
abstract class CanalNotificacion
{
    abstract public function enviar(string $destinatario, string $mensaje): bool;
}

// 2. Implementaciones Especializadas
final class CanalEmail extends CanalNotificacion
{
    public function enviar(string $destinatario, string $mensaje): bool
    {
        echo "<p style='color:#0284c7;'>📧 <strong>Email enviado a [{$destinatario}]:</strong> {$mensaje}</p>";
        return true;
    }
}

final class CanalSms extends CanalNotificacion
{
    public function enviar(string $destinatario, string $mensaje): bool
    {
        echo "<p style='color:#10b981;'>📱 <strong>SMS despachado a [{$destinatario}]:</strong> {$mensaje}</p>";
        return true;
    }
}

final class CanalWhatsApp extends CanalNotificacion
{
    public function enviar(string $destinatario, string $mensaje): bool
    {
        echo "<p style='color:#16a34a;'>💬 <strong>WhatsApp enviado a [{$destinatario}]:</strong> {$mensaje}</p>";
        return true;
    }
}

// 3. Servicio de Negocio Polimórfico
final class ServicioAlertas
{
    // Acepta CUALQUIER objeto que herede de CanalNotificacion
    public function dispararAlerta(CanalNotificacion $canal, string $destino, string $texto): void
    {
        // Despacho dinámico: PHP sabe a qué enviar() llamar según la instancia recibida
        $canal->enviar($destino, $texto);
    }
}

// ==========================================
// EJECUCIÓN POLIMÓRFICA EN BUCLE
// ==========================================
$servicio = new ServicioAlertas();

// Colección de canales heterogéneos
$canales = [
    ['canal' => new CanalEmail(),    'destino' => '[email protected]', 'msg' => 'Tu compra ha sido confirmada.'],
    ['canal' => new CanalSms(),      'destino' => '+573001234567',        'msg' => 'Tu código de verificación es 849201.'],
    ['canal' => new CanalWhatsApp(), 'destino' => '+573109876543',        'msg' => 'Tu pedido va en camino a tu domicilio.']
];

echo "<h2>Despacho Polimórfico de Alertas:</h2>";
foreach ($canales as $item) {
    $servicio->dispararAlerta($item['canal'], $item['destino'], $item['msg']);
}
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ál es la principal ventaja arquitectónica de utilizar Polimorfismo en lugar de estructuras switch ($tipo)?
🦉
¿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.