La herencia en PHP5

  • Por
Explicamos la herencia en PHP 5, un proceso por el cual los objetos pueden heredar las características de otros, de modo que se pueden hacer objetos especializados, basados en otros más generales.

La herencia es uno de los mecanismos fundamentales de la programación orientada a objetos. Por medio de la herencia, se pueden definir clases a partir de la declaración de otras clases. Las clases que heredan incluyen tanto los métodos como las propiedades de la clase a partir de la que están definidos.

Por ejemplo, pensemos en la clase "vehículo". Esta clase general puede incluir las características generales de todos los vehículos (atributos de la clase), como la matrícula, año de fabricación y potencia. Además, incluirá algunas funcionalidades (métodos de la clase) como podrían ser, arrancar() o moverse().

Ahora bien, en la práctica existen varios tipos de vehículos, como los coches, los autobuses y los camiones. Todos ellos tienen unas características comunes, que han sido definidas en la clase vehículo. Además, tendrán una serie de características propias del tipo de vehículo, que, en principio, no tienen otros tipos de vehículos. Por ejemplo, los camiones pueden tener una carga máxima permitida o los autobuses un número de plazas disponibles. Del mismo modo, las clases más específicas pueden tener unas funcionalidades propias, como los camiones cargar() y descargar(), o los autobuses aceptar_pasajeros() o vender_billete().

Lo normal en sistemas de herencia es que las clases que heredan de otras incluyan nuevas características y funcionalidades, aparte de los atributos y métodos heredados. Pero esto no es imprescindible, de modo que se pueden crear objetos que hereden de otros y no incluyan nada nuevo.

Sintaxis de herencia en PHP 5

La programación orientada a objetos nos ofrece una serie de mecanismos para definir este tipo de estructuras, de modo que se puedan crear jerarquías de objetos que heredan unos de otros. Veremos ahora cómo definir estas estructuras de herencia en PHP 5. Para ello, continuando con nuestro ejemplo de video club, vamos a crear los distintos tipos de elementos que se ofrecen en alquiler.

Como todo el mundo conoce, los video clubs ofrecen distintos tipos de elementos para alquiler, como pueden ser las películas (cintas de vídeo o DVD) y los juegos. Cada elemento tiene unas características propias y algunas comunes. Hemos llamado "soporte" a la clase general, que incluye las características comunes para todos los tipos de elementos en alquiler. Luego hemos creado tres tipos de soportes distintos, que heredan de la clase soporte, pero que incluyen algunas características y funcionalidades nuevas. Estos tipos de soporte serán "cinta_video", "dvd" y "juego".

El esquema de herencia que vamos a realizar en este ejemplo se puede ver en la siguiente imagen.

Empezamos por la clase soporte. Su código será el siguiente:

class soporte{ 
   public $titulo; 
   protected $numero; 
   private $precio; 

   function __construct($tit,$num,$precio){ 
      $this->titulo = $tit; 
      $this->numero = $num; 
      $this->precio = $precio; 
   } 

   public function dame_precio_sin_iva(){ 
      return $this->precio; 
   } 

   public function dame_precio_con_iva(){ 
      return $this->precio * 1.16; 
   } 

   public function dame_numero_identificacion(){ 
      return $this->numero; 
   } 

   public function imprime_caracteristicas(){ 
       echo $this->titulo; 
       echo "<br>" . $this->precio . " (IVA no incluido)"; 
   } 
}

Los atributos que hemos definido son, título, numero (un identificador del soporte) y precio. Hemos aplicado a cada uno un modificador de acceso distinto, para poder practicar los distintos tipos de acceso.

Hemos definido un constructor, que recibe los valores para la inicialización del objeto. Un método dame_precio_sin_iva(), que devuelve el precio del soporte, sin aplicarle el IVA. Otro método dame_precio_con_iva(), que devuelve el precio una vez aplicado el 16% de IVA. El método dame_numero_identificacion(), que devuelve el número de identificador y imprime_caracteristicas(), que muestra en la página las características de este soporte.

Nota: Como se ha definido como private el atributo precio, este atributo sólo se podrá acceder dentro del código de la clase, es decir, en la propia definición del objeto. Si queremos acceder al precio desde fuera de la clase (algo muy normal si tenemos en cuenta que vamos a necesitar el precio de un soporte desde otras partes de la aplicación) será necesario crear un método que nos devuelva el valor del precio. Este método debería definirse como public, para que se pueda acceder desde cualquier sitio que se necesite.

En todos los métodos se hace uso de la variable $this. Esta variable no es más que una referencia al objeto sobre el que se está ejecutando el método. En programación orientada a objetos, para ejecutar cualquiera de estos métodos, primero tenemos que haber creado un objeto a partir de una clase. Luego podremos llamar los métodos de un objeto. Esto se hace con $mi_objeto->metodo_a_llamar(). Dentro de método, cuando se utiliza la variable $this, se está haciendo referencia al objeto sobre el que se ha llamado al método, en este caso, el objeto $mi_objeto. Con $this->titulo estamos haciendo referencia al atributo "titulo" que tiene el objeto $mi_objeto.

Si queremos probar la clase soporte, para confirmar que se ejecuta correctamente y que ofrece resultados coherentes, podemos utilizar un código como el siguiente.

$soporte1 = new soporte("Los Intocables",22,3); 
echo "<b>" . $soporte1->titulo . "</b>"; 
echo "<br>Precio: " . $soporte1->dame_precio_sin_iva() . " euros"; 
echo "<br>Precio IVA incluido: " . $soporte1->dame_precio_con_iva() . " euros";

En este caso hemos creado una instancia de la clase soporte, en un objeto que hemos llamado $soporte1. Luego imprimimos su atributo titulo (como el título ha sido definido como public, podemos acceder a él desde fuera del código de la clase.

Luego se llaman a los métodos dame_precio_sin_iva() y dame_precio_con_iva() para el objeto creado.

Nos daría como resultado esto:

Los Intocables
Precio: 3 euros
Precio IVA incluido: 3.48 euros

En siguientes capítulos vamos a ver cómo definir clases que hereden de la clase soporte.

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

Roberto Aquino

24/1/2008
Muy bueno el manual, pero pienso que seria bueno que en el esquema tambien se indique los modificadores de visibilidad para familiarizare con UML. Por ejemplo:

SOPORTE
- titulo
# numero
+ precio

lgv

31/5/2009
Pregunta
Hola soy nueva en esto y he estado hacienod todo paso a paso como lo indican, pero me sale un error Fatal error: Class 'soporte' not found in C:xampphtdocsvideoclubclasscinta_video.php on line 2 tengo esto en el cofigo no se sialguien me puede ayudar gracias...

<?
class cinta_video extends soporte{

private $duracion;

function __construct($tit,$num,$precio,$duracion){
parent::__construct($tit,$num,$precio);
$this->duracion = $duracion;
}
public function imprime_caracteristicas(){
echo "Película en VHS:<br>";
parent::imprime_caracteristicas();
echo "<br>Duración: " . $this->duracion;
}
}
?>


este es el otro codigo que utilicé para ejecutar la clase no se si algo está mal en esto

<?
include ("classcinta_video.php");

$micinta = new cinta_video("Los Otros", 22, 4.5, "115 minutos");

echo "<b>" . $micinta->titulo . "</b>";
echo "<br>Precio: " . $micinta->dame_precio_sin_iva() . " euros";
echo "<br>Precio IVA incluido: " . $micinta->dame_precio_con_iva() . " euros";
?>