El estudio de este concepto en la Programación Orientada a Objetos es muy importante y, gracias a él seremos capaces reutilizar parte del código ya escrito en otra clase. Para que existe Herencia o Legado hay que tener dos clases: una madre y otra hija. Decir que una clase hija hereda de una clase madre, es decir que accede a todos los atributos y métodos públicos de la clase madre.
En el siguiente esquema puede observarse como las clases Perro y Ave son unos ejemplos de herencia de la clase Animal.
A la clase madre se programa cómo normalmente se hace en PHP, ya visto en otros artículos, pero las clases hijas deben ser declaradas con la palabra reservada extends entre el nombre de la clase hija y la clase madre. Veamos las sintaxis.
Para llevar a cabo este ejemplo realizaremos los siguientes pasos:
- Creación de la clase madre, Animal, y archivaremos el código en el fichero Animal.class.php
- Creación de la clase hija, Ave, y su código será guardado en un nuevo fichero: Ave.class.php
- Creación de una nueva clase hija, Perro, y será guardado en Perro.class.php
- Implementaremos código para el uso de las clases anteriormente creadas. Fichero: uso.php
1) Animal.class.php
<?php class Animal { //Atributos private $color; private $peso; //Declaración de la variable estática $contador private static $contador = 0; //Accesos public function get_color () { return $color; } public function set_color ($color) { $this->color = $color; } public function get_peso () { return $peso; } public function set_peso ($peso) { $this->peso = $peso; } //métodos public function comer () { echo "ñam ñam<br>"; } public function moverse () { echo "desplazamiento 2 metros adelante<br>"; } public function __construct ($color, $peso){ echo "Llamada al constructor.<br>"; $this->color = $color; $this->peso = $peso; self::$contador = self::$contador+1; } //método estático que devuelve el valor del contador public static function getContador() { return self::$contador; } } ?>
2) Ave.class.php
<?php class Ave extends Animal { //atributos private $tipo; //accesos get y set public function getTipo () { if ($this->tipo === true) { return "vuela"; }else if ($this->tipo === false) { return "no vuela"; }else { return ""; } } public function setTipo ($tipo) { $this->tipo = $tipo; } //método public function volar () { echo "Vuelo<br>"; } } ?>
3) Perro.class.php
<?php class Perro extends Animal { private $raza; //accesos get y set public function getRaza () { return $this->raza; } public function setRaza ($raza){ $this->raza = $raza; } //método public function ladrar (){ echo "Guau Guau Guau<br>"; } } ?>
4) uso.php
<?php //carga de clases include ('class/Animal.class.php'); include ('class/Ave.class.php'); include ('class/Perro.class.php'); //instanciar la clase Ave que llama al contructor de //la clase Animal $ave = new Ave ("verde", 1); //instanciar la clase Perro que llama al constructor de //la clase Animal $perro = new Perro ("blanco", 4); //lee el peso con el acceso de la clase madre echo "El peso del ave es: ".$ave->getPeso()." kg<br>"; //lee el peso con el acceso de la clase madre echo "El peso del Perro es: ".$perro->getPeso()." kg<br>"; $ave->setTipo(true); //Leer el tipo con el acceso de su propia clase echo "El tipo de ave: ".$ave->getTipo ()." <br>"; //llamada al método de la clase Perro echo "¡Ladra perro! "; $perro->ladrar(); //LLamada al método estático echo "Número de animales que se han instanciado: ".Animal::getContador(); ?>