Como programar en PHP utilizando Programación Orientada a Objetos

VIE, 22 / ENE / 2021

Herencia

Veremos una introducción a una de las características más importantes de la programación orientada a objetos (POO), la herencia, uno de los pilares de este paradigma, muy empleado para reutilizar código, y diseñar aplicaciones escalables, seguras y modernas.

Introducción

Una de las particularidades de la programación orientada a objetos es la reutilización del código, es decir, la creación de programas que no repitan las mismas instrucciones una y otra vez, sino que puedan aprovechar lo que ya se ha generado. La herencia se defi ne como la capacidad de crear nuevas clases a partir de otras ya existentes. Esta es, posiblemente, una de las características más importantes del paradigma, por lo que vale la pena explicarla y comprenderla en detalle, dado que muchos otros conceptos importantes, como la sobrescritura o la abstracción, se basan en la herencia. Por lo tanto, será necesario entenderla bien para poder avanzar en todos los temas.
La herencia ocurre cuando una clase hereda a otra, o sea, cuando obtiene todos sus métodos y atributos. Al decir esto ya se puede percibir una de sus ventajas: si una clase hereda de otra, no hay que volver a escribir todas sus propiedades, porque las obtiene por herencia.
Existen ciertas reglas a la hora de diagramar la herencia en un programa, debido a que, por lo general, la POO se basa en moldear objetos; la
herencia sigue un patrón que debería respetarse.
Para saber si una clase debería heredar de otra, puedes aplicar un mecanismo simple. Si deseas que la clase B herede de la clase A, deberás preguntarte: ¿es B un tipo de A?
Dicho de esta forma, puede resultar algo confuso, pero con un ejemplo podrás entenderlo mejor. Si tienes una clase llamada Animal y otra denominada Perro, ¿es posible hacer que Perro herede de Animal? Esto se responde preguntándote si Perro es un tipo de Animal. La respuesta obviamente es sí, perro es un tipo de animal, por lo que podrías programar tu clase Animal y, luego, hacer que Perro herede de ella, con lo cual obtendrá todos sus atributos y métodos.
Hasta el momento, esto no muestra claramente cómo se aprovecha la reutilización de código. Para entenderlo mejor, considera el siguiente ejemplo. Debes diagramar y crear un programa, ya sea en PHP o en otro lenguaje orientado a objetos, en el que se necesitan objetos de tipo usuario. Y entre los usuarios, existen clientes, empleados y jefes, pero todos son un tipo de usuario.
Gracias a la herencia, es posible declarar una clase, llamada Usuario, donde tienes atributos como una cuenta, una contraseña, puntos por
usar el servicio, entre otros. Cada una de las tres clases, que hereda de Usuario, obtendrá estas características, por lo que solo las declaras una vez y las aprovechas en tres clases más. Luego, puedes hacer que cada clase tenga sus propias características únicas, como que los jefes tengan capacidad de modificar otras cuentas, los empleados tengan métodos que permitan vender o manipular productos, y los clientes posean menos características que las otras dos.
La herencia se suelen diagramar con una flecha, que sale de la primera clase y va hacia la clase que hereda los atributos y métodos.

La clase principal, aquella que contiene los atributos y métodos, se conoce como clase padre o superclase, mientras que la clase que hereda de ella es la clase hija o subclase. En estos ejemplos, la clase Usuario, la clase Animal o Vehículo, son las clases padre o superclases y, por otro lado, las clases Empleado, Cliente, Perro y Auto son subclases.
Al mismo tiempo, estas subclases podrían volverse también clases padre de otras. Esto es así porque en PHP, y en muchos otros lenguajes, existe la posibilidad de crear una herencia lineal, donde una clase A es superclase de B y, luego, esta lo es de otra clase C. Para verlo con más claridad, piensa en una superclase llamada SerVivo. De ella pueden heredar otras dos, una clase Animal y una clase Planta. A su vez, de la clase Animal hereda otra llamada Perro, otra llamada Gato, y así todas las que sean necesarias.

Entonces, es posible tener clases que hereden de otras, en forma de línea, todas las veces que así se requiera. Un aspecto que PHP no soporta es la herencia múltiple: no se puede hacer que una clase herede de más de otra al mismo tiempo; por ejemplo, una clase Perro no podría heredar tanto de Animal como de Planta. Esto no es correcto semánticamente, ni tampoco se puede lograr en el lenguaje, aunque sí ocurre en otros. Veamos algunos ejemplos de herencia a través del código, para entenderla mejor. Retomando el ejemplo de la clase SerVivo, comienza programando la superclase:

<?php
class SerVivo {
         //atributos
         private $edad;
         private $especie;

         //metodos
        function nacer(){
                 return “El ser ha nacido”;
        }

        function alimentarse(){

                   return “Todos los seres vivos se alimentan”;
         }

        function reproducirse(){
                 return “El ser vivo puede reproducirse”;
         }
}
?>

La clase, que será heredada por otras, contiene características que les son comunes a todos los seres vivos: todos pertenecen a una especie, tienen una edad, nacen, tienen una forma de alimentación y pueden reproducirse. De esta clase puede heredar otra, la clase Animal:

<?php
class Animal {
       //atributos

       private $cantidadDePatas;
       private $esCarnivoro;

        //metodos
        function respirar(){
                 return “Los animales pueden respirar”;
        }

        function tipoAlimentacion(){
                 return “El animal es carnívoro: ” . $this-
>esCarnivoro;
         }
}
?>

En esta subclase Animal, se defi nen algunos métodos y atributos nuevos, comunes a todos los animales. Pero las características que estaban dentro de SerVivo no se vuelven a escribir, porque se van a heredar. Para que esto sea posible, es necesario utilizar una palabra reservada, extends, por medio de la cual se logra que una clase herede de otra, de la siguiente forma:

<?php
class Animal extends SerVivo{
        …
}
?>

Aquí se ve que Animal hereda de SerVivo, y la semántica de la herencia se mantiene, porque un animal es, de hecho, un tipo de ser vivo. Y como hereda de ella, un objeto de la clase animal obtiene las características de la clase SerVivo, tanto sus métodos como sus atributos:

<?php
class Animal extends SerVivo{
       …
}

$miAnimal = new Animal();

echo $miAnimal->nacer();
?>

Dentro de la clase Animal no es necesario declarar el método nacer, pero aun así se puede hacer uso de él, ya que lo heredó. De esta forma, se
consigue ver mejor el uso de la herencia y de qué manera puede emplearse para aprovecharse el código.
En los volúmenes anteriores de esta obra, se explicaron los modificadores de acceso, entre los que se encontraban public, o modificador por
defecto, que se usa cuando no se escribe ningún modificador; private, que encapsula los atributos dentro de la clase; y protected. Este último
indica que la propiedad a la cual se lo aplique solo será accesible desde esa clase y desde las clases que hereden de ella.
Aquí se declaran las propiedades de la clase SerVivo como protected:

<?php
class SerVivo {
       //atributos
       protected edad;

       protected especie;
}
?>

Y serán accesibles desde la clase Animal:

<?php
class Animal extends SerVivo{

       function muestraEdad(){
                return “El ser vivo tiene: ” . $this->edad . “
años.”;
         }
}
?>

Dentro de la clase Animal, es posible acceder a todas las características de la clase SerVivo que sean de tipo protected, por herencia.
También es posible continuar la herencia lineal, creando una clase Gato y una clase Perro, las cuales hereden de Animal. Esto les daría por herencia las características tanto de Animal como de SerVivo:

<?php
class Perro extends Animal{

       function muestraPatas(){
                return “El perro tiene ” . $this->cantidadDePatas
. “ patas”;

        } 

        function muestraEspecie(){
                  return $this->especie;
         }
}
?>

Si los atributos especie y cantidadDePatas se declararon como protected en sus clases, por herencia, Perro podrá acceder a ellas. Sin embargo, suponiendo que exista una clase Planta, no sería posible hacer que Perro heredara de ella, ya que está heredando de Animal. No sería correcto semánticamente, porque no es un tipo de planta, ni tampoco el lenguaje permite la herencia múltiple.

Aprende más sobre Herencia; Abstracción; Características estáticas y como realizar un CRUD, leyendo la edición completa de este ebook en RedUSERS PREMIUM


Cada mes, lanzamos 2 ebooks USERS, estas publicaciones tratan en profundidad el tema abordado. En ellas, nuestros EXPERTOS vuelcan todos sus conocimientos con el objetivo de brindar una experiencia de capacitación satisfactoria para nuestros lectores.


Lee lo que quieras, donde vayas, por una mínima cuota mensual: SUSCRIBETE!


¡Comparte esta noticia!