Herencia en PHP

  • Por
  • PHP
Hablaremos de esta peculiar característica para hacer copias independientes y personalizadas de clases ya construidas, propia de la programación orientada a objetos.

La programación orientada a objetos tiene un mecanismo llamado herencia por el que se pueden definir clases a partir de otras clases. Las clases realizadas a partir de otra clase o mejor dicho, que extienden a otra clase, se llaman clases extendidas o clases derivadas.

Las clases extendidas heredan todos los atributos y métodos de la clase base. Además, pueden tener tantos atributos y métodos nuevos como se desee.

Para ampliar el ejemplo que venimos desarrollando, la clase Caja, vamos a crear una clase extendida llamada Caja_tematica. Esta clase hereda de caja, pero además tiene un "tema", que es la descripción del tipo de cosas que metemos en la caja. Con esto podemos tener varias cajas, cada una con cosas de un tema concreto.

class Caja_tematica extends Caja{ 
  	var $tema;

  	function define_tema($nuevo_tema){ 
  	$this->tema = $nuevo_tema; 
  	} 
}

En esta clase heredamos de Caja, con lo que tenemos a nuestra disposición todos los atributos y métodos de la clase base. Además, se ha definido un nuevo atributo, llamado $tema, y un método, llamado define_tema(), que recibe el tema con el que se desea etiquetar la caja.

Podríamos utilizar la clase Caja_tematica de manera similar a como lo hacíamos con la clase Caja original.

$micaja_tematica = new Caja_tematica(); 
$micaja_tematica->define_tema("Cables y contectores"); 
$micaja_tematica->introduce("Cable de red"); 
$micaja_tematica->introduce("Conector RJ45"); 
$micaja_tematica->muestra_contenido();

En este caso, el resultado que se obtiene es parecido al que se obtiene para la clase base. Sin embargo, cuando se muestra el contenido de una caja, lo más interesante sería que se indicara también el tipo de objetos que contiene la caja temática. Para ello, tenemos que redefinir el método muestra_contenido().

Redefinir métodos en clases extendidas

Redefinir métodos significa volver a codificarlos, es decir, volver a escribir su código para la clase extendida. En este caso, tenemos que redefinir el método muestra_contenido() para que muestre también el tema de la caja.

Para redefinir un método, lo único que debemos hacer es volverlo a escribir dentro de la clase extendida.

function muestra_contenido(){ 
  	echo "Contenido de la caja de <b>" . $this->tema . "</b>: " . $this->contenido; 
}

En este ejemplo hemos codificado de nuevo el método entero para mostrar los datos completos.

En algunas ocasiones es muy útil apoyarse en la definición de un método de la clase base para realizar las acciones de la clase extendida. Por ejemplo, para este ejemplo, tenemos que definir un constructor para la clase Caja_tematica, en el que también se inicialice el tema de la caja. Como ya existe un método constructor en la clase base, no merece la pena reescribir el código de éste, lo mejor es llamar al constructor que había definido en la clase Caja original, con lo que se inicializarán todos los datos de la clase base, y luego realizar la inicialización para los atributos de la propia clase extendida.

Para llamar a un método de la clase padre dentro del código de un método que estamos redefiniendo, utilizamos una sintaxis como esta:

function Caja_tematica($alto=1,$ancho=1,$largo=1,$color="negro",$tema="Sin clasificación"){ 
  	parent::Caja($alto,$ancho,$largo,$color); 
  	$this->tema=$tema; 
}

Aquí vemos la redefinición del constructor, de la clase Caja, para la clase Caja_tematica. El constructor hace primero una llamada al constructor de la clase base, a través de una referencia a "parent". Luego inicializa el valor del atributo $tema, que es específico de la Caja_tematica.

En la misma línea de trabajo, podemos redefinir el método muestra_contenido() apoyándonos en el que fue declarado en la clase base. El código quedaría como sigue:

function muestra_contenido(){ 
  	echo "Contenido de la caja de <b>" . $this->tema . "</b>: "; 
  	parent::muestra_contenido(); 
}

Autor

Miguel Angel Alvarez

Miguel es fundador de DesarrolloWeb.com y la plataforma de formación online EscuelaIT. Comenzó en el mundo del desarrollo web en el año 1997, transformando su hobby en su trabajo.

Compartir

Comentarios

Wilton

09/11/2004
Este es uno de los pocos manuales mantenidos con calidad que he podido ver en la Red.

Congratulation.

Ronald Laya

15/2/2008
Una pregunta... el método introduce() lo que hace es asignar a la variable miembro "contenido" el valor del parámetro, según lo que puedo apreciar, ¿cierto? Imagino que lo que se quiere es tener un arreglo llamado contenidos. ¿Cuando llamamos a $var->introduce('Cosa'); se está sobreescribiendo el valor que tenía la variable miembro o php entiende que se trata de agregar a un arreglo? ¿Cómo se hace cada una de esas cosas?

Eri

26/1/2009
Hola, solo para agregar que php5 tiene la posibilidad de crear un metodo llamado __construct, que sera el constructor de la clase, por lo tanto si quieres llamar el contructor en una clase hija debes usar parent::__construct( tus argumentos )

Gracias.

luis

13/11/2014
herencias
yo he utilizado las herencias en php herendando el constructor de esta manera

class nombre extends otraclase{
function __construct(){
parent::__contruct();
}
}