Está en la página 1de 4

CUANDO UTILIZAR LA HERENCIA

La herencia permite tomar una clase como base para crear una nueva clase. La nueva clase hereda todos los
atributos y comportamientos de la clase existente. Muchas veces se hereda una clase con el solo objetivo de
utilizar su implementacin, lo cual en ocasiones es un error

Cmo saber entonces cuando utilizar la herencia?. Lo primero que uno debe considerar antes de heredar
una clase es fijarse si la clase que hereda es del mismo tipo que la clase que pretende heredar.

Por ejemplo, tenemos la clase UsuarioAdministrador que hereda la clase Usuario. En esta situacin debe
preguntarse si UsuarioAdministrador es un Usuario. En este caso sabr inmediatamente que la herencia es
adecuada.

<?php
// creamos la clase Usuario
class Usuario{
protected $_nombre;
protected $_apellido;
protected $_nivelAcceso = 0;

function __construct($nombre, $apellido) {
$this->_nombre = $nombre;
$this->_apellido = $apellido;
}

function __toString() {
return "Usuario: $this->_nombre $this->_apellido - nivel de acceso: $this->_nivelAcceso";
}
}

//creamos la clase UsuarioAdministrador
class UsuarioAdministrador extends Usuario{

function __construct($nombre, $apellido) {
parent::__construct($nombre, $apellido);
$this->_nivelAcceso = 1;
}
}

$usuario_1 = new Usuario("Juan", "Prez");
$usuario_2 = new UsuarioAdministrador("Carlos", "Serrat");
echo $usuario_1 . '<br>' . $usuario_2;

?>

Ahora supongamos que queremos que los distintos usuarios puedan dejar mensajes, y para este fin tenemos la
clase llamada Mensajes. Estara bien que para usar la implementacin de la clase Mensajes dentro de la
clase Usuarios utilicemos la herencia?. Deberamos preguntarnos si Usuario es del mismo tipo que la
clase Mensajes, o sea si Usuario es un Mensaje, lo que claramente nos conduce a una respuesta
negativa.

Una de las formas de sortear este problema es sencillamente crear variables internas o usar un array como si
fuera una coleccin que contengan la instancia de la clase que queramos utilizar.

<?php
// creamos la clase Mensajes
class Mensajes{
private $_mensaje;
function __construct($mensaje){
$this->_mensaje = $mensaje;
}
function __toString(){
return $this->_mensaje;
}
}

// creamos la clase Usuario
class Usuario{
protected $_nombre;
protected $_apellido;
protected $_nivelAcceso = 0;
protected $_mensajes = array();

function __construct($nombre, $apellido){
$this->_nombre = $nombre;
$this->_apellido = $apellido;
}

public function agregarMensaje($mensaje){
$this->_mensajes[] = new Mensajes($mensaje);
}

function __toString(){
$string = "Usuario: $this->_nombre $this->_apellido - nivel de acceso: $this->_nivelAcceso ";
$string .= "<br> Mensajes: ";
foreach($this->_mensajes as $value){
$string .= "<br>- $value ";
}
return $string;
}
}

$usuario_1 = new Usuario("Juan", "Prez");
$usuario_1->agregarMensaje("Mensaje 1");
$usuario_1->agregarMensaje("Mensaje 2");
$usuario_1->agregarMensaje("Mensaje 3");
echo $usuario_1;
?>
Fuente: http://www.inkuba.com/blog/cuando-utilizar-la-herencia/#sthash.R9NnWrDb.dpuf

POLIMORFISMO PARA SER MS EFICIENTES.
Una de las posibilidades ms tiles que nos ofrece el trabajar con objetos es el polimorfismo. Imagina una
clase abstracta que sirve de base a cinco o seis clases hijas, de esta forma unes toda las funcionalidades
que comparten en una misma clase y solo modificas o aades pequeos matices en las hijas. Pongamos un
ejemplo, tenemos diferentes tipos de pelotas, de ftbol, baloncesto y tenis. Todas comparten su forma
redonda, tu capacidad de rodar y rebotar, pero ninguna es igual a la anterior, tienen un peso diferente, una
textura diferente, color, etctera. No es necesario crear las funcionalidades de rodar y rebotar en cada una de
las pelotas, podemos crear una clase padre que tenga esa capacidad y luego solo debemos heredar:

<?php
class PelotaBase{
protected $peso = 0;
protected $textura = 'lisa';
protected $color = 'ninguno';

public function rebotar(){
echo "Estoy rebotando";
}

public function rodar(){
echo "Estoy rodando";
}

public function __toString(){
return "Soy " . get_called_class() . " y peso {$this->peso}, mi textura es {$this->textura}, y mi color
{$this->color}";
}
}

class PelotaDeTenis extends PelotaBase{
public $peso = 1;
public $textura = 'Peluda';
public $color = 'Verde';
}

class PelotaDeFutbol extends PelotaBase{
public $peso = 2;
public $textura = 'Cuero';
public $color = 'Blanca y Negra';
}

class PelotaDeBaloncesto extends PelotaBase{
public $peso = 3;
public $textura = 'Rugosa';
public $color = 'Naranja';
}
$tenis = new PelotaDeTenis();
echo $tenis; //Imprime: Soy PelotaDeTenis y peso 1, mi textura es Peluda, y mi color Verde

$futbol = new PelotaDeFutbol();
echo $futbol; //Imprime: Soy PelotaDeFutbol y peso 2, mi textura es Cuero, y mi color Blanca y Negra

$baloncesto = new PelotaDeBaloncesto();
echo $baloncesto; //Imprime: Soy PelotaDeBaloncesto y peso 3, mi textura es Rugosa, y mi color Naranja
?>

Ntese que uso get_called_class() en vez de la constante mgica __CLASS__, esto se debe a que si usramos
la constante el nombre que nos devolvera sera el de la PelotaBase, y yo quiero el nombre de la clase que
ejecuta el mtodo, no donde se declar, por eso usando get_called_class() obtenemos el nombre de la clase
hija que lo est ejecutando.
Como ves son idnticas, las tres heredan de PelotaBase y la nica diferencia de una a otras son los atributos
para adecuarlos a sus propiedades reales, veamos el script:
De esta forma hemos conseguido que usando la misma clase como base tengamos comportamientos
diferentes, los cuales podemos modificar a nuestro antojo, aadirle nuevas funcionalidades o sustituir las ya
declaradas por otras ms acordes a nuestro objeto.
Quizs no lo veas aun pero el polimorfismo es esencial, imagina una clase trabajador, que sirve de base
para las clases director, albail, programador, etctera, todas comparten una base pero su misin final es muy
diferente, esto nos ayuda a programar cdigo ms eficiente, tenemos todo bien localizado y no es necesario
modificar un sin nmero de clases para realizar cambios simples porque lo haramos en la clase padre.

Fuente: http://www.nazariglez.com/2013/03/03/tutorial-php-polimorfismo-para-ser-mas-eficientes/







Recomendaciones
1. revisar mtodos mgicos en php, les sera muy til
2. http://www.inkuba.com/blog/el-polimorfismo-php/
3.

También podría gustarte