Una de las posibilidades más útiles que nos ofrece el trabajar con objetos es el polimorfismo. Imagina una clase abstracta que sirve de base a cinco o seis clases “hijas“, de esta forma unes toda las funcionalidades que comparten en una misma clase y solo modificas o añades pequeños matices en las hijas. Pongamos un ejemplo, tenemos diferentes tipos de pelotas, de fútbol, baloncesto y tenis. Todas comparten su forma redonda, tu capacidad de rodar y rebotar, pero ninguna es igual a a anterior, tienen un peso diferente, una textura diferente, color, etcétera. No es necesario crear las funcionalidad de rodar y rebotar en cada una de las pelotas, podemos crear una clase padre que tenga esa capacidad y luego solo debemos heredar:

PelotaBase.php:

<?php 
class PelotaBase { 
    protected $peso = 0; 
    protected $textura = 'lisa'; 
    protected $color = 'ninguno'; 

    public function rebotar(){ 
        echo "Estoy rebotando"; 
    } 

    public function rodar(){ 
        echo "Estoy rodando"; 
    } 

    public function __toString(){ 
        return "Soy " . get_called_class() . " y peso {$this->peso}, mi textura es {$this->textura}, y mi color {$this->color}"; 
    } 
} 
?>

Nótese que uso get_called_class() en vez de la constante mágicaCLASS, esto se debe a que si usáramos la constante el nombre que nos devolvería seria el de la PelotaBase, y yo quiero el nombre de la clase que ejecuta el método, no donde se declaro, por eso usando get_called_class() obtenemos el nombre de la clase hija que lo esta ejecutando.

Veamos ahora las clases “hijas”:

PelotaDeTenis.php:

<?php 
require_once('PelotaBase.php'); 

class PelotaDeTenis extends PelotaBase { 
    public $peso = 1; 
    public $textura = 'Peluda'; 
    public $color = 'Verde'; 
} 
?>

PelotaDeFutbol.php:

<?php 
require_once('PelotaBase.php'); 

class PelotaDeFutbol extends PelotaBase { 
    public $peso = 2; 
    public $textura = 'Cuero'; 
    public $color = 'Blanca y Negra'; 
} 
?>

PelotaDeBaloncesto.php:

<?php 
require_once('PelotaBase.php'); 

class PelotaDeBaloncesto extends PelotaBase { 
    public $peso = 3; 
    public $textura = 'Rugosa'; 
    public $color = 'Naranja'; 
} 
?>

Como ves son idénticas, las tres heredan de PelotaBase y la única diferencia de una a otras son los atributos para adecuarlos a sus propiedades reales, veamos el script:

script.php:

<?php 
require_once('PelotaBase.php');
require_once('PelotaDeTenis.php');
require_once('PelotaDeFutbol.php');
require_once('PelotaDeBaloncesto.php'); 

$tenis = new PelotaDeTenis(); 
echo $tenis; //Imprime: Soy PelotaDeTenis y peso 1, mi textura es Peluda, y mi color Verde 

$futbol = new PelotaDeFutbol(); 
echo $futbol; //Imprime: Soy PelotaDeFutbol y peso 2, mi textura es Cuero, y mi color Blanca y Negra 

$baloncesto = new PelotaDeBaloncesto(); 
echo $baloncesto; //Imprime: Soy PelotaDeBaloncesto y peso 3, mi textura es Rugosa, y mi color Naranja 
?>

De esta forma hemos conseguido que usando la misma clase como base tengamos comportamientos diferentes, los cuales podemos modificar a nuestro antojo, añadirle nuevas funcionalidades o sustituir las ya declaradas por otras más acordes a nuestro objeto.

Quizás no lo veas aun pero el polimorfismo es esencial, imagina una clase “trabajador”, que sirve de base para las clases director, albañil, programador, etcétera, todas comparten una base pero su misión final es muy diferente, esto nos ayuda a programar código mas eficiente, tenemos todo bien localizado y no es necesario modificar un sin numero de clases para realizar cambios simples porque lo haríamos en la clase “padre“.