1. Universidad Politécnica Territorial Andrés Eloy Blanco
Programa Nacional de Formación en Informática
Ing. Lissette Torrealba
1.Conceptos básicos: Clases,Objetos,Herencia, en Programación Orientado a Objeto
Unidad VI
Herencia
Objetivo de la Unidad:
Comprender e implementar el concepto de Herencia de la Programación Orientada a Objeto que le permitirá
la construcción de software reutilizable, escalable, de fácil mantenimiento y de mayor calidad.
Definicion
HERENCIA
El concepto de herencia nos permite crear una nueva clase que esté basada en otra clase ya existente. Esto
nos sirve cuando nos damos cuenta de que precisamos una nueva clase que posea métodos o propiedades
muy semejantes a los de otra clase ya definida. En vez de declarar dos veces lo mismo, simplemente
“extendemos” la clase primera, como si creáramos un duplicado de ésta, y tendremos una clase “hija”. Luego a
ese duplicado le podemos agregar algunas otras propiedades y/o métodos propios de esa clase hija y no de la
original, es decir, especializamos un poco más sus funcionalidades. La nueva clase va a poder acceder a sus
propios métodos y propiedades, pero también a los de su clase “padre” que hayan sido declarados como
protected o como public (pero no podrá acceder a los que hayan sido declarados como private).
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.
Principales ventajas
1. Si se aplica bien el concepto de herencia conseguiremos una reutilización eficiente del código de la clase
base. Ya que estemos utilizando el mismo código en las dos clases, padre e hijo, pero solo lo habremos escrito
una vez.
2. Una de las principales ventajas de la herencia es la propagación de los cambios realizados en la clase base.
Cualquier cambio que se realice en las clases base será accesible inmediatamente en las clases heredadas.
Siempre cuando la visibilidad introducida lo permita. Sin embargo hay que tener cuidado con esta característica.
Ya que cambios realizados en las clases base pueden causar problemas en las clases heredadas que han sido
creadas por otras personas. Por lo que hay que asegurarse que los cambios son compatibles con las clases
heredadas. Por ejemplo, podríamos añadir nuevos atributos y métodos y no modificar los existentes.
Introducción
LA Herencia, El polimorfismo y las interfaces son mecanismos que se usan comúnmente en la programación orientada a
objeto. Por medio de la herencia se pueden definir nuevas clases a partir de las declaraciones de clases existentes, Las
clases pueden tener los mismos métodos (con el mismo nombre), pero cada una los pueden implementar de forma
diferente.
Puede suceder que existan objetos que no pertenezcan a la misma jerarquía de herencia, pero que deban realizar
acciones comunes.Esta guía permitirá estudiar estos conceptos.
Objetivo.
Entender el Mecanismo de abstracción de la Herencia y sus ventajas.Implementar Jerarquías de Herencia en PHP
Requerimientos.
Se debe contar con: Un (1) computador teniendo como mínimo el Sistema Operativo Libre ( Canaima/Ubuntu),Apache,
PHP, Editor de Texto.
Componentes.
2. Universidad Politécnica Territorial Andrés Eloy Blanco
Programa Nacional de Formación en Informática
Ing. Lissette Torrealba
3. La herencia es transitiva. Esto significa que una clase puede heredar características de la clase base que se
encuentra niveles más arriba en la jerarquía de herencia. Por ejemplo si la clase Mercedes es una subclase de
la clase Coche, y la clase Coche es una subclase de la clase Vehículo, entonces el Mercedes heredará
tributos tanto de Coche como de Vehículo.
Herencia y constructores
Cuando defines un constructor propio en la clase hija es necesario pasar los argumentos al constructor de la
clase base.
Por lo tanto, lo primero, para poder pasar dichos argumentos, es encontrar la manera de acceder al método la
clase base. Y eso se hace usando la siguiente sintaxis:
parent::__construct();
De esta forma invocaremos al constructor de la clase base de la cual que hereda la clase actual.
Y ¿para que queremos definir un constructor (en la clase hija), y por lo tanto, invocar al constructor de la clase
base? Pues muy sencillo, no siempre queremos que algún método de la clase hija se comporte exactamente
igual que de la clase base.
Seguramente querremos utilizar la funcionalidad del constructor padre y extenderla. Pero manteniendo la
funcionalidad que aportaba el método heredado.
Sobrescritura de Métodos
La sobrescritura es muy común en mecaniso de herencia, puesto que los métodos que fueron creados para
una clase base no necesariamente de deban implementar del mismo modo para sus subclases. Sobrescribir
un método significa redefinirlo, es decir otorgarle otro comportamiento distinto al definirl o en la clase padre. Al
mecanismo de añadir funcionalidad a un método heredado, y por lo tanto llamado de la misma forma en ambas
clase, se llama sobrescritura. Ya que estamos sobrescribiendo el funcionamiento del mismo. Y este mecanismo
no solo se puede utilizar con los constructores sino que en cualquier método heredado de una clase base.
Lo más conveniente es sobrescribir métodos para completar el algoritmo del método de la clase base. Y no es
recomendable sobreescribir un método y cambiar completamente su comportamiento. Ya que para eso lo
mejor es crear un nuevo método en la clase hija.
Y al igual que con el constructor del apartado anterior, para invocar al método de la clase padre utilizaremos la
sintaxis: parent::metodo($argumentos).
Ejemplo:
<?php
class Estudiante{
private $nombre;
private $fechaNac;
private $sexo;
protected $idEstudiante;
private $inscrito;
public function inscribirse(){
$this->inscrito= true;}
}
class EstPregrado extends Estudiante{
public function inscribirse(){
parent:: inscribirse();
echo “Se inscribió el estudiantes de Pregrado”;}
}
class EstPostgrado extends Estudiante{
private $anioGraduacion;
private $carreraPregrado;
private $idEstudiante;
public function inscribirse(){
echo “Año de Graduación: ”, $this-> anioGraduacion;
echo “Carrera: “,$this-> carreraPregrado;
parent:: inscribirse();
}
}
?>
La palabra clave parent, hace
referencia a la clase de la cual se
esta heredando.
Al usar parent::metodo(), se llama
a la función que se sobrescribio
3. Universidad Politécnica Territorial Andrés Eloy Blanco
Programa Nacional de Formación en Informática
Ing. Lissette Torrealba
Visibilidad y Herencia
- Los atributos y métodos declarados como públicos podrán utilizarse desde cualquier contexto: desde la
misma clase, desde una clase heredada o desde el exterior.
- Los atributos y métodos declarados como privados no podrán ser accedidos desde otro sitio que no sea el
interior de la clase en donde están declarados. Por lo tanto no se podrán sobrescribir características privadas
en las clases heredadas.
Ya que las clases hijas no tendrán acceso a esas características privadas.
- Los atributos y métodos declarados como protegidos solo podrán ser accedidos desde la clase que los
declara o desde una clase heredera. Pero nunca desde el exterior de una clase.
Gracias a la visibilidad solo se expondrán las características que sean requeridas por un cliente (que podría ser
otra clase). Y evitar que se puedan modificar libremente atributos de un objeto. Ya que solo se podrán
modificar los atributos que la definición de la clase permita y mediante los métodos requeridos para ello. Por lo
tanto podríamos completar un poco las clases de los ejemplos anteriores para que cualquier modificación de un
atributo se haga mediante métodos de acceso.
Representación UML
La representación en UML es una “flecha continua” que va desde la clase “hija” hasta la clase “padre”, similar
a la relación de “asociación”, pero con la diferencia que termina con una punta en forma de triángulo.
Nota: entender la diferencia de las flechas: si es punteada (“no continua”) la relación es más débil que una
“flecha continua”. Por lo tanto la Herencia es una relación igual de fuerte que la asociación, pero más fuerte
que una relación como la “dependencia” (“línea punteada”).
Un diagrama genérico sería:
Ejemplo de traducción a código
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.
A continuación vamos a ver un ejemplo sencillo de herencia en PHP
1. Primero crearemos la clase base.
Producto.php
class Producto {
protected $id;
private $titulo;
private $precio;
La herencia es siempre
transitiva: una clase puede
heredar características de
superclases que se
encuentran muchos niveles
más arriba en la jerarquía
de herencia.
Ejemplo: si la clase Perro
es una subclase de la clase
Mamífero, y la clase
Mamífero es una subclase de
la clase Animal, entonces el
Perro heredará atributos
tanto de Mamífero como de
Animal.
4. Universidad Politécnica Territorial Andrés Eloy Blanco
Programa Nacional de Formación en Informática
Ing. Lissette Torrealba
private $nombreAutor;
private $apellidosAutor;
function __construct($id, $titulo, $precio,$nombreAutor,$apellidosAutor){
$this->id = $id;
$this->titulo= $titulo;
$this->nombreAutor = $nombreAutor;
$this->apellidosAutor = $apellidosAutor;
$this->precio = $precio;
}
public function getAutor() {
return $this->nombreAutor . " ". $this->apellidosAutor;}
public function getTitulo(){
return $this->precio;
}
public function getPrecio(){
return $this->precio;
}
}
2. Clase que heredará de la clase base.
<?php require_once 'Producto.php';
class Libro extends Producto {
public function getResumen() {
$resumen = "Titulo: " . $this->getTitulo() . ", Precio: " . $this->getPrecio();
$resumen .= ", Autor: " .$this->getAutor() . ", Núm. páginas: " .$this-
>getNumPaginas();
return $resumen;
}
}
Como no hemos definido ninguno constructor específico en esta clase, se heredará el de la clase base. Por lo
tanto cuando creamos un objeto instanciado de la clase Libro deberemos de añadir los parámetros que
necesitaba el constructor de la clase base.
$libro1 = new Libro(1,"título",20,"Autor", "Apellido1 Apellido2");
echo $libro1->getResumen();
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.
No hacer abuso de la visibilidad
protegida, solo en casos
excepcionales donde se justifique.
En los casos habituales todos
los atributos deben ser
privados y en casos excepcionales
a través de algunos métodos
getter/setter.
5. Universidad Politécnica Territorial Andrés Eloy Blanco
Programa Nacional de Formación en Informática
Ing. Lissette Torrealba
class Resta extends Operacion{
public function operacion() {
return $this->numero1 - $this->numero2;} // fin del método operación higiene
}// fin dela clase
Y este objeto ahora daría 4:
$mi_resta = new resta(8, 4);
echo $mi_resta->operacion();
Tipo de Herencia
Herencia Simple: Hace referencia que una clase solo puede heredar comportamiento y características de una
única superclase (clase base/padre)
Herencia Múltiple: Hace referencia en que una clase puede heredar comportamiento y características de
mas de una superclase
En PHP no es posible extender de
múltiples clases, PHP no soporta
la Herencia Múltiple
6. Universidad Politécnica Territorial Andrés Eloy Blanco
Programa Nacional de Formación en Informática
Ing. Lissette Torrealba
Sobrescritura De Método
7. Universidad Politécnica Territorial Andrés Eloy Blanco
Programa Nacional de Formación en Informática
Ing. Lissette Torrealba
Clases y Métodos Finales
8. Universidad Politécnica Territorial Andrés Eloy Blanco
Programa Nacional de Formación en Informática
Ing. Lissette Torrealba
Actividad a Realizar
Realizar la siguiente practica en tu computador
Escribir el siguiente código de una clase llamada vehiculo cuyo archivo se llama vehiculo.php
9. Universidad Politécnica Territorial Andrés Eloy Blanco
Programa Nacional de Formación en Informática
Ing. Lissette Torrealba
Ahora implementemos herencias a través de dos clase hijas quienes heredan de la clase padre vehiculo.
Código de la clase Auto que hereda de la clase Vehiculo.Archivo auto.php
Código de la clase Moto que hereda de la clase Vehiculo.Archivo moto.php
Como vemos ambas clases tienen menos código.Ahora vamos a lo importante que permite la herencia:
La herencia permite que clase como Auto y Moto hereden de una clase madre,en nuestro caso la clase Vehiculo.
¿Y que es lo que heredan?
Las clases hijs heredan de las clase madres todos las propiedades y métodos , lo que permite ahorrar líneas
de códigos innecesarias .
Vamos a repasar los puntos:
1.- dentro de la clases hijas deben incluirse con require_once el archivo .php, donde se encuentra la clase
madre.
2.- cuando definimos la clase hija debemos utilizar la palabra reservada extends mas el nombre de la clase
madre:
class ClaseHija extends ClasePadre.
Por ejemplo en la clase Vehiculo tenemos un constructor como este:
public function __construct($nro_puertas,$nro_ruedas,$marca){
$this->cantidad_puertas=$nro_puertas;
$this->cantidad_ruedas=$nro_ruedas;
$this->marca=$marca;
}
10. Universidad Politécnica Territorial Andrés Eloy Blanco
Programa Nacional de Formación en Informática
Ing. Lissette Torrealba
Pero en la clase Moto lo que hacemos es sobreescribr el metodo de la clase madre:
public function __construct($nro_puertas,$nro_ruedas,$marca){
parent::__construct(0,$nro_ruedas,$marca);
toma el valor 0 en la propiedad , ya que una moto no tiene puertas.
Ademas para llamar a métodos de una clase hija a una clase madre no lo hacemos con $thismetodo(). Si no co
parent::metodo. En el caso de las propiedades se llaman con $this propiedad.
Y por ultimo fíjate que en la case madre no usamos private para las propiedades sino que usamos la palabra reservada
proteted. (consultar modificadores de accesos).
Por ultimo les dejo el código de construir los objetos.
Creando el Objeto auto. Archivo index.php
Creando el objeto Moto
Código completo
11. Universidad Politécnica Territorial Andrés Eloy Blanco
Programa Nacional de Formación en Informática
Ing. Lissette Torrealba
Te invito a pasar la práctica a Modelo Vista Controlador
Referencias Bibliográficas
Un sitio clave para quienes programamos en PHP orientado a objetos es PHPClasses:
http://www.phpclasses.org