Herencia en PHPOO.

Publicado por el 7/02/2017. Categoría: php, Programación Web

¡Hola amig@s! ¿Cómo están? Primero, gracias a todos los que me siguen, comentan y me leen. Hoy veremos un tema que es muy útil a la hora de realizar un sistema grande. La herencia como vimos en el post Conceptos básicos y pilares de la Programación Orientada a Objetos (POO) es uno de los mecanismos de los lenguajes de programación orientada a objetos basados en clases, por medio del cual una clase se deriva de otra de manera que extiende su funcionalidad.
Entonces podemos ahorrar código, tiempo al referenciar desde la clase hija los métodos y/o propiedades de la clase padre. En PHP para usar la herencia debemos hacer uso de la palabra clave “extends”, la usamos en la clase hija, ahora veremos como:


class Ingeniero extends Persona
{
	//Atributos
	private $especialidad;

	//Constructor
	function __construct()
	{
		$this->especialidad = "";
		echo "Soy el Constructor en la clase hija: " . __CLASS__ . "
" ;
	}

	//PropiedadesGETySET
	public function setEspecialidad($especialidad){
		$this->especialidad = $especialidad;
	}

	public function getEspecialidad(){
		return $this->especialidad;
	}

}

En esta clase heredamos de Persona, por lo tanto, tenemos a nuestra disposición todos los métodos, atributos y propiedades de la clase padre “Persona” (si quieres ver como se compone esta clase por favor haz click aque para ver el post anterior o puedes ir al final del post).
Ahora como atributo único de la clase hija “Ingeniero”, tenemos $especialidad y dos propiedades una llamada setEspecialidad(), que lo que hace básicamente es recibir la especialidad de la clase ingeniero y otra getEspecialidad(), que devuelve el valor insertado en setEspecialidad() y un constructor.
Esta clase hija “Ingeniero” la podemos utilizar igual a como usamos la clase padre “Persona”. Por ejemplo:


//Instanciamos el objeto
$ingeniero = new Ingeniero();
//Asignamos un valor al atributo mediante la propiedad set, esto se podría obtener de un input text
$ingeniero->setEspecialidad("Sistemas"); 
//Mostramos el resultado
echo "La especialidad del ingeniero es: " . $ingeniero->getEspecialidad();

Hasta acá venimos bien, creamos una clase hija y la instanciamos obteniendo como resultado un mensaje con la especialidad de la clase “Ingeniero”.

Ahora les mostraré como acceder a los métodos y propiedades de acuerdo a su nivel de definición.

Métodos y propiedades públicas (public)
Si nosotros tenemos todos los métodos y propiedades de una clase padre declaradas públicas y queremos acceder desde una clase hija, lo vamos a poder hacer ya que es accesible por ser pública. Es como lo vimos anteriormente.

Métodos y propiedades protegidas (protected)
Cuando un método o propiedad están declarados como protegidos, sólo puede acceder la misma clase o las clases hijas. Pero necesitamos en la clase hija crear un método que acceda a este método padre. Por ejemplo:


//Creamos un método protegido en la clase Padre Persona
protected function metodoProtegidoClasePadre(){
	echo "
 Soy un método protegido de la clase padre " . __CLASS__ ;
}	

Luego en la clase hija “Ingeniero” creamos otro método para poder acceder al método protegido anterior:


//Método
public function mostrarMetProtectedClasPadre(){
	return $this->metodoProtegidoClasePadre();
}

Una vez hecho esto accedemos al método luego de instanciar el objeto:


//Accedemos al método protegido de la clase padre
echo $ingeniero->mostrarMetProtectedClasPadre();

Métodos y propiedades privadas (private)

Como sabemos en las clases tenemos atributos y métodos que a veces se deben declarar privados por una cuestión de seguridad limitando los lugares desde los cuales se pueden acceder, es decir si tenemos un método declarado como private no podemos acceder desde otra clase al mismo, sólo es accesible por la clase que lo define o crea. Por lo tanto, no podremos acceder a los métodos o propiedades privadas de la clase padre de ninguna forma.

Nuestro código completo nos queda así:

 
class Persona
{
    //Atributos
    private $nombre;
    private $apellido;
    private $edad;
    private $sexo;

    //Constructor
    function __construct() {
      	$this->nombre = "";
		$this->apellido = "";
		$this->edad = "";
		$this->sexo = 0;
		echo "Soy el constuctor de la clase: " . __CLASS__ . "
" ;
    }

    //Propiedades
    //Nombre
	public function getNombre() 
	{
		return $this->nombre;
	}
			
	public function setNombre($nombre)
	{
		$this->nombre = $nombre;
	}

	//Apellido
	public function getApellido() 
	{
		return $this->apellido;
	}
			
	public function setApellido($apellido)
	{
		$this->apellido = $apellido;
	}

	//Edad
	public function getEdad() 
	{
		return $this->edad;
	}
			
	public function setEdad($edad)
	{
		$this->edad = $edad;
	}

	//Sexo
	public function getSexo() 
	{
		return $this->sexo;
	}
			
	public function setSexo($sexo)
	{
		$this->sexo = $sexo;
	}


    //Métodos
	public function soyUnMetodo()
	{
 		echo "Soy un método de la clase: " . __CLASS__ . ".
 Me llamo: <b>" . $this->getNombre() . " " . $this->getApellido() . "</b> y tengo <b>" . $this->getEdad() . "</b> años. 
 Género: <b>" . $this->getSexo() . "</b>";

	}

	protected function metodoProtegidoClasePadre(){
		echo "
 Soy un método protegido de la clase padre " . __CLASS__ ;
	}

	private function metodoPrivadoClasePadre(){
		echo "
 Soy un método privado de la clase padre " . __CLASS__ ;
	}

}
 

class Ingeniero extends Persona
{
	//Atributos
	private $especialidad;

	//Constructor
	function __construct()
	{
		$this->especialidad = "";
		echo "Soy el Constructor en la clase hija: " . __CLASS__ . "
" ;
	}

	//PropiedadesGETySET
	public function setEspecialidad($especialidad){
		$this->especialidad = $especialidad;
	}

	public function getEspecialidad(){
		return $this->especialidad;
	}

	//Método
	public function mostrarMetProtectedClasPadre(){
		return $this->metodoProtegidoClasePadre();
	}

	public function mostrarMetPrivadoClasPadre(){
		return $this->metodoPrivadoClasePadre();
	}

}

//Instanciamos el objeto
$ingeniero = new Ingeniero();
//Asignamos un valor al atributo mediante la propiedad set, esto se podría obtener de un input text
$ingeniero->setEspecialidad("Sistemas"); 
//Mostramos el resultado
echo "La especialidad del ingeniero es: " . $ingeniero->getEspecialidad();
//Accedemos al metodo protegido de la clase padre
echo $ingeniero->mostrarMetProtectedClasPadre();
//Intentamos acceder al metodo privado de la clase padre
echo $ingeniero->mostrarMetPrivadoClasPadre();

Los que nos da como resultado en nuestro navegador, algo así:

Resultado Ejercicio

Puedes compartir nuestro post en los siguientes medios:

Emi Garin es una programadora y diseñadora web apasionada por las nuevas tecnologías y el constante aprendizaje. Estudió analista y programador superior de sistemas y le encanta la cocina y la pastelería.

    Deja un comentario

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *