PHP (07) POO (03) Accesos

Hasta ahora nuestras propiedades y métodos han sido accesibles desde cualquier parte del código, por lo que no hemos tenido ningún problema a la hora de trabajar con ellos, pero en la programación orientada a objetos hay varias formas de poner restricciones, para ello vamos a utilizar varias palabras reservadas:

  • Public: la opción por defecto, es visible a todo
  • Private: significa accesible solo desde la misma clase
  • Protected: accesible solo desde la misma clase y desde las clases derivadas.

Private

Se puede hacer privada una propiedad o un método, pero si se hace esto, ya solo podrán ser accesibles desde dentro de la clase o el objeto y no desde otro lado.
En el siguiente ejemplo probamos a ha hacer privada la propiedad $nombre y a acceder a ella desde fuera desde la clase, para ello cambiamos var por private.

<?php
 class Person
 {
  private $nombre;

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

  function get_nombre()
  {
   return $this->nombre;
  }
 }
 $persona1 = new Person;
 $persona1->set_nombre('Miguel');

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

Lo cual nos da como resultado:

Mostrando con $persona1->get_nombre: Miguel


Fatal error: Cannot access private property Person::$nombre in C:\xampp\htdocs\miphp\POO\persona.php on line 20

La razón es que en el primer echo hemos accedido al valor de la propiedad invocando al método de la clase, que es pública, mientras que en el segundo echo, que es el que nos muestra el error, hemos intentado acceder a la propiedad directamente pero al encontrarnos fuera de la clase nos es inaccesible debido a su privacidad.
También podemos hacer privadas los métodos de una clase, simplemente colocando la palabra reservada private delante de su declaración.
En este caso vamos a convertir en private la función get_nombre:
<?php
 class Person
 {
  var $nombre;

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

  private function get_nombre()
  {
   return $this->nombre;
  }
 }
 $persona1 = new Person;
 $persona1->set_nombre('Miguel');

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

Este código no puede acceder al primer echo, ya que la función get_nombre es privada, mostrándonos el siguiente error:

Fatal error: Call to private method Person::get_nombre() from context ” in C:\xampp\htdocs\miphp\POO\persona.php on line 19

Pero si comentamos el primer echo y lo ejecutamos, observamos que si accede al valor de la propiedad mostrando su valor.

Mostrando con $persona1->nombre: Miguel