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
yGato
heredan y cambianhacerSonido()
a su manera.- La función
hacerRuido()
acepta cualquierAnimal
y llama ahacerSonido()
, 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 tenerhacerSonido()
.Perro
yGato
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
yRectangulo
implementancalcularArea()
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:
- Áreas de figuras geométricas
Creafiguras_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
ocalcularArea
). - 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
oimplements
. - 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.