1

PHP orientado a objetos 4: herencia I

https://www.mmfilesi.com/blog/php-orientado-a-objetos-4-herencia-i/

En la entrada anterior de esta serie vimos cómo pueden colaborar entre sí las distintas clases declarando objetos de una clase dentro de otra. En esta veremos otra manera en que se pueden relacionar: mediante la herencia, que es otro pilar fundamental de la programación orientada a objetos.

Se denomina herencia a la capacidad de una clase de emplear todos los métodos y propiedades de otra clase, lo cual se consigue en PHP mediante la palabra reservada extends.

Por ejemplo, si tenemos esta clase:

class padre
{

public function saluda() {

echo “Hola Mundo”;

}

}

Y luego la extendemos a otra:

class hija extends padre
{

}

Podríamos usar todos los métodos y propiedades de la clase padre, pues han sido «heredados» por la hija. Así, esto…

$mi_hija = new hija();

$mi_hija->saluda();

…devolvería por pantalla “Hola Mundo”, aunque la clase hija carezca de métodos y propiedades, pues los ha recibido de la clase padre.

«¿Y para qué diantres sirve esto?», podemos preguntarnos entonces, si ya tenemos la clase padre que hace eso. Muy sencillo: para ahorrarnos muchísimo código mediante la sobrescritura de métodos y propiedades.

Sobrescritura de métodos
Una de las bondades de la herencia es que podemos ampliar o redefinir algunas funcionalidades de la clase original, por lo que parte del código se puede reciclar, ahorrándonos mucho esfuerzo tanto en el desarrollo, como en el mantenimiento. Es por ejemplo como se realizan los widgets de WordPress a partir de una clase original llamada WP_Widget.

Esto se comprende bien con con el caso de antes si añadimos una función a la clase hija que devuelva el saludo:

class hija extends padre

{

public function respondeSaludo() {

echo “<br />Hola aplicación”;

}

}

Ahora la clase hija tiene una funcionalidad añadida respecto a la padre. Ya hace dos cosas, pero solo hemos tenido que escribir una.

$mi_hija = new hija();

$mi_hija->saluda();

$mi_hija->respondeSaludo();

Pero también podemos cambiar las funcionalidades originales reescribiendo los métodos. Así, por ejemplo, si quisiéramos que dijera «Hola Venus» en vez de «Hola Mundo», solo tendríamos que redefinir el método en la clase hija:

class hija extends padre

{

public function saluda() {
echo “Hola Venus”;
}

public function respondeSaludo() {
echo “<br />Hola aplicación”;
}

}

Veamos otro ejemplo para terminar de entender esto. Imaginemos que tenemos una clase llamada operacion que sirve para sumar dos números. Fijaos que las propiedades están definidas como protected, para que puedan ser accesibles por las clases hijas.

class operacion

{

protected $numero1;

protected $numero2;

public function __construct($numero1, $numero2) {

$this->numero1 = $numero1;

$this->numero2 = $numero2;

}

public function operacion() {

return $this->numero1 + $this->numero2;

}

}

Así, por ejemplo, esto devolvería 12:

$mi_suma = new operacion(8, 4);

echo $mi_suma->operacion();

Pero reescribiendo la clase, podemos conseguir que reste en vez de sumar. Fijaos en que no es necesario declarar el método constructor en la clase hija, pues lo hereda de la clase padre.

class resta extends operacion

{

public function operacion() {

return $this->numero1 - $this->numero2;

}

}

Y este objeto ahora daría 4:

$mi_resta = new resta(8, 4);

echo $mi_resta->operacion();

Bueno, queda mucho más por contar de la herencia, pero de momento vamos a dejarlo aquí. Seguiré con esta cuestión en la próxima entrada de esta serie, donde conoceremos qué es el misterioso operador Paamayim Nekudotayim 😛.

Escribe tu comentario
+ 2