Inicio » Blog » Polimorfismo en PHP

Polimorfismo en PHP

Bienvenido a una nueva lección de nuestro curso básico de PHP 8. Hoy nos metemos con el polimorfismo, un concepto estrella de la programación orientada a objetos (POO) que hace tu código súper flexible. Si ya manejas clases, objetos y herencia, esto te va a encantar porque es como magia. Todo va a ser claro, práctico y con ejemplos que te van a flipar. ¡Empecemos!

¿Qué es el polimorfismo?

El polimorfismo significa «muchas formas». En POO, permite que objetos de diferentes clases respondan al mismo método de manera distinta, pero usando una interfaz común. Es como si le dices «¡haz un sonido!» a un perro y a un gato, y cada uno responde a su estilo: el perro ladra y el gato maúlla. Todo fluye sin que tengas que preocuparte por los detalles.

En PHP, logras polimorfismo con:

  • Herencia: Clases hijas que redefinen métodos de la clase padre.
  • Interfaces: Contratos que obligan a las clases a implementar ciertos métodos.

Probando polimorfismo en acción

¡Manos a la obra! Crea un archivo polimorfismo.php en curso_php8 (dentro de C:\xampp\htdocs) y prueba esto:

<?php
    class Animal {
        public function hacerSonido() {
            echo "Sonido genérico<br>";
        }
    }

    class Perro extends Animal {
        public function hacerSonido() {
            echo "El perro dice: ¡Guau guau!<br>";
        }
    }

    class Gato extends Animal {
        public function hacerSonido() {
            echo "El gato dice: ¡Miau miau!<br>";
        }
    }

    function hacerRuido(Animal $animal) {
        $animal->hacerSonido();
    }

    $miPerro = new Perro();
    $miGato = new Gato();

    hacerRuido($miPerro);
    hacerRuido($miGato);
?>

Abre http://localhost/curso_php8/polimorfismo.php. Verás:

El perro dice: ¡Guau guau!
El gato dice: ¡Miau miau!

¿Qué pasó?

  • Animal es la clase padre con un método genérico.
  • Perro y Gato heredan y cambian hacerSonido() a su manera.
  • La función hacerRuido() acepta cualquier Animal y llama a hacerSonido(), sin importar si es un perro o un gato.

Ejemplo 2: Polimorfismo con interfaces

<?php
    interface Animal {
        public function hacerSonido();
    }

    class Perro implements Animal {
        public function hacerSonido() {
            echo "El perro dice: ¡Guau guau!<br>";
        }
    }

    class Gato implements Animal {
        public function hacerSonido() {
            echo "El gato dice: ¡Miau miau!<br>";
        }
    }

    function hacerRuido(Animal $animal) {
        $animal->hacerSonido();
    }

    $miPerro = new Perro();
    $miGato = new Gato();

    hacerRuido($miPerro);
    hacerRuido($miGato);
?>

Resultado:

El perro dice: ¡Guau guau!
El gato dice: ¡Miau miau!

¿Qué pasó?

  • interface Animal es un contrato que obliga a tener hacerSonido().
  • Perro y Gato lo implementan, cada uno a su estilo.
  • hacerRuido() usa la interfaz como tipo, así que funciona con cualquier clase que la cumpla.

Ejemplos prácticos para brillar

Ejemplo: Figuras geométricas

<?php
    abstract class Figura {
        abstract public function calcularArea();
    }

    class Circulo extends Figura {
        public $radio;

        public function __construct($radio) {
            $this->radio = $radio;
        }

        public function calcularArea() {
            return pi() * $this->radio * $this->radio;
        }
    }

    class Rectangulo extends Figura {
        public $ancho;
        public $alto;

        public function __construct($ancho, $alto) {
            $this->ancho = $ancho;
            $this->alto = $alto;
        }

        public function calcularArea() {
            return $this->ancho * $this->alto;
        }
    }

    function mostrarArea(Figura $figura) {
        echo "El área es: " . $figura->calcularArea() . "<br>";
    }

    $circulo = new Circulo(5);
    $rectangulo = new Rectangulo(4, 6);

    mostrarArea($circulo);
    mostrarArea($rectangulo);
?>

Resultado:

El área es: 78.539816339745
El área es: 24

¿Qué pasó?

  • Usamos una clase abstracta Figura para definir el contrato.
  • Circulo y Rectangulo implementan calcularArea() de forma diferente.
  • mostrarArea() trata a ambas figuras igual, gracias al polimorfismo.

Ejercicios para practicar

Tu turno de codigo! Ve a curso_php8 y prueba este reto:

  1. Áreas de figuras geométricas
    Crea figuras_polimorfismo.php:
<?php
       interface Forma {
           public function calcularArea();
       }

       class Circulo implements Forma {
           public $radio;

           public function __construct($radio) {
               $this->radio = $radio;
           }

           public function calcularArea() {
               return pi() * $this->radio * $this->radio;
           }
       }

       class Rectangulo implements Forma {
           public $ancho;
           public $alto;

           public function __construct($ancho, $alto) {
               $this->ancho = $ancho;
               $this->alto = $alto;
           }

           public function calcularArea() {
               return $this->ancho * $this->alto;
           }
       }

       function mostrarArea(Forma $forma) {
           echo "Área: " . $forma->calcularArea() . "<br>";
       }

       $circulo = new Circulo(3);
       $rectangulo = new Rectangulo(5, 7);

       mostrarArea($circulo);
       mostrarArea($rectangulo);
   ?>

Ejecuta en localhost/curso_php8/ y juega con los valores.

Consejos para no enredarte

  • Interfaces claras: Usa nombres que digan qué hace el método (como hacerSonido o calcularArea).
  • Tipado estricto: Declara el tipo (Animal $animal) para asegurar que solo objetos válidos entren.
  • Abstractas o interfaces: Elige según el caso: interfaces para contratos simples, clases abstractas si necesitas algo de código compartido.

¡A por más POO!

¡Gran trabajo, máquina! Ahora el polimorfismo es tu arma para hacer código flexible y elegante. En la próxima lección, veremos encapsulación para proteger tus objetos como un castillo. Si algo no te queda claro, déjame un comentario.

Lo que aprendiste hoy:

  • Qué es: Diferentes clases respondiendo al mismo método, cada una a su manera.
  • Herencia e interfaces: Dos formas de lograrlo, con extends o implements.
  • Ejemplos vivos: Hiciste perros, gatos y figuras como crack.
  • Practicaste: Calculaste áreas con polimorfismo como pro.
  • Tip del pro: Usa interfaces para mantener tu código limpio y predecible.

Deja un comentario

Scroll al inicio