sábado, 25 de octubre de 2014

PHP (07) POO (06) Herencias (04) Acceso a métodos del padre

Cuando queremos llamar a un método del padre, por norma general no es un problema, ya que al haber heredado todos los métodos y propiedades de este, es posible acceder a ellos de forma normal, pero puede ocurrir que el padre tenga algunos métodos protegidos (protected), para ello debemos utilizar la expresión parent:: tal y como vimos con los constructores.
De este modo, podemos hacer el método publico y acceder al método o la propiedad.
En el siguiente ejemplo vemos como los métodos de la clase padre están protegidos y como se puede acceder a ellos a través de la clase heredada:
<?php
 class Person
 {
  var $nombre;
  var $edad;

  protected function set_nombre($dato)
  {
   $this->nombre = $dato;
  }
  
  protected function get_nombre()
  {
   return $this->nombre;
  }

  protected function set_edad($dato)
  {
   $this->edad = $dato;
  }
  
  protected function get_edad()
  {
   return $this->edad;
  }
 }

 class Ciudad extends Person
 {
  var $ciudad;

  function set_ciudad($dato)
  {
   $this->ciudad = $dato;
  }
  
  function get_ciudad()
  {
   return $this->ciudad;
  }

  function set_nombre_publico($dato)
  {
   parent::set_nombre($dato);
  }

  function get_nombre_publico()
  {
   return parent::get_nombre();
  }

  function set_edad_publico($dato)
  {
   parent::set_edad($dato);
  }

  function get_edad_publico()
  {
   return parent::get_edad();
  }

 }

 $persona1 = new Ciudad;
 $persona1->set_nombre_publico('Mateo');
 $persona1->set_edad_publico('27');
 $persona1->set_ciudad('Madrid');

 echo '<p>Mostrando nombre con $persona1->get_nombre_publico: ' . $persona1->get_nombre_publico() . '</p>';
 echo '<p>Mostrando edad con $persona1->get_edad_publico: ' . $persona1->get_edad_publico() . '</p>';
 echo '<p>Mostrando ciudad con $persona1->get_ciudad: ' . $persona1->get_ciudad() . '</p>';
?>


En este script se observa como los métodos de la clase padre están protegidos, y como aparecen los métodos para hacerlos publicos a través de nuevos métodos en la clase heredada por medio de parent:: que son los accesibles a la hora de crear y acceder a los datos del objeto.
De hecho el resultado obtenido aquí sería:
Mostrando nombre con $persona1->get_nombre_publico: Mateo
Mostrando edad con $persona1->get_edad_publico: 27
Mostrando ciudad con $persona1->get_ciudad: Madrid


Pero la herencia puede tener diferentes niveles, ¿y que ocurriría si un padre tuviera un método protegido y se quisiera acceder desde una clase que herede de otra que herede el padre? (vamos que sería la nieta)
Pues en este caso ya no nos valdría la forma que hemos visto, pero para resolverlo es tan sencillo como cambiar la palabra parent, por el nombre de la clase que tiene el método protegido:
function set_nombre_publico($dato)
{
 Person::set_nombre($dato);
}

Tan sencillo como eso, de hecho, se puede utilizar este método para las herencias directas.

No hay comentarios:

Publicar un comentario