PHP (07) POO (06) Herencias (02) Acceso protegido

Al utilizar la palabra reservada protected, estamos haciendo que la propiedad o método sea solo accesible desde la propia clase y de sus herederas, de modo que no se puede acceder desde el resto del código.

En el siguiente ejemplo vemos como funciona esto:

class Person
 {
  var $nombre;
  var $edad;

  //Aquí comienzan los geters y seters de las propiedades.
  protected function set_nombre($dato)
  {
   $this->nombre = $dato;
  }

  function get_nombre()
  {
   return $this->nombre;
  }

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

  function get_edad()
  {
   return $this->edad;
  }
 }

Esto hace imposible acceder al método set_nombre si no es desde la propia clase Person o de sus herederas, por lo que no podemos acceder a ella de la forma habitual:

$persona1->set_nombre('Antonio');

Para poder acceder a ella se debe de hacer desde su heredera, creando un método que permita llamar al protegido y pasarle el valor como vemos en el siguiente ejemplo completo:

<?php
 class Person
 {
  var $nombre;
  var $edad;

  //Aquí comienzan los geters y seters de las propiedades.
  protected function set_nombre($dato)
  {
   $this->nombre = $dato;
  }

  function get_nombre()
  {
   return $this->nombre;
  }

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

  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)
  {
   $this->set_nombre($dato);
  }
 }

 $persona1 = new Ciudad;
 $persona1->set_nombre_publico('Antonio');
 $persona1->set_edad('23');
 $persona1->set_ciudad('Zaragoza');

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

Aquí vemos como en la clase Ciudad se llama traves de la función set_nombre_publico a la función set_nombre que está protegida, de modo que al introducir el nombre de la persona se accede por medio de set_nombre_publico.

De este modo se obtiene el resultado deseado:

Mostrando nombre con $persona1->get_nombre: Antonio

Mostrando edad con $persona1->get_edad: 23

Mostrando ciudad con $persona1->get_ciudad: Zaragoza