Php orientado a objetos, parte 3: Niveles de acceso

Si leíste mis dos anteriores posteos habrás notado que al definir propiedades y métodos en una clase utilice la palabra public al principio, y dije que lo explicaría más adelante. Bueno, esta vez trataré eso.

En la programación orientada a objetos existe algo llamado niveles de acceso. En el primer posteo, Php orientado a objetos, parte 1: Clases, propiedades y métodos, yo creaba una clase con este aspecto:

<?php 
 class Persona { 
    public $nombre;
    public $apellido;
    public $edad;
    public function saludar(){
       return 'Hola, soy ' . $this->nombre . ' ' . $this->apellido . ' y tengo ' . $this->edad . ' años '; 
    }
 }

Y luego al crear el objeto basado en la clase Persona, yo podía acceder desde dicho objeto a las propiedades $nombre, $apellido y $edad, pero también al método saludar().

Ahora bien, yo podía hacerlo debido a que al definir la clase utilice public delante tanto de las propiedades como de los métodos. Sin embargo esto tienen sus desventajas, no tanto   en cuanto al método saludar(), que es un método al cual yo necesito utilizar una vez creado el objeto, sino más bien en las propiedades.

Normalmente en la programación orientada a objetos las propiedades no suelen ser accedidas desde el objeto, ya que esto presenta un problema de seguridad, por tanto para proteger nuestras propiedades, para que solamente sean accedidas desde la clase y nunca desde el objeto se utiliza private.

Luego, en el siguiente posteo, Php orientado a objetos, parte 2: Método constructor y destructor, yo utilicé un método constructor para setear los valores de las propiedades al crear el objeto y no accediendo desde las mismas propiedades. La clase tenía este aspecto:

<?php 
 class Persona { 
    public $nombre;
    public $apellido;
    public $edad;
    public function __construct($nombre, $apellido, $edad) {
       $this->nombre = $nombre;
       $this->apellido = $apellido;
       $this->edad = $edad;
    }
    public function saludar(){
       return 'Hola, soy ' . $this->nombre . ' ' . $this->apellido . ' y tengo ' . $this->edad . ' años '; 
    }
 }
?>

Entonces para setear las propiedades yo lo hacía desde el constructor de esta forma:

$persona = new Persona('Fernando', 'Gaitan', 26);

Y me evitaba hacer esto:

$persona->nombre = 'Fernando';
$persona->apellido = 'Gaitan';
$persona->edad = 26;

Ahora bien, copiaremos la misma clase que usamos en el anterior posteo, pero cambiaremos los niveles de acceso de las propiedades de public a private de esta forma:

<?php 
 class Persona { 
    private $nombre;
    private $apellido;
    private $edad;
    public function __construct($nombre, $apellido, $edad) {
       $this->nombre = $nombre;
       $this->apellido = $apellido;
       $this->edad = $edad;
    }
    public function saludar(){
       return 'Hola, soy ' . $this->nombre . ' ' . $this->apellido . ' y tengo ' . $this->edad . ' años '; 
    }
 }
?>

Para probar que todo ha salido bien volveremos a hacer lo mismo de siempre:

<?php
 require_once 'clases/Persona.php';
 $persona = new Persona('Fernando', 'Gaitan', 26);
 echo $persona->saludar();
?>

Nada nuevo, ahora buscaremos problemas y romperemos nuestro script tratando de setear el valor de una propiedad desde el objeto de esta forma:

<?php
 require_once 'clases/Persona.php';
 $persona = new Persona('Fernando', 'Gaitan', 26);
 //Intentamos setear el valor de la propiedad privada para comprobar que se rompe nuestro script.
 $persona->nombre = 'Cosme Fulanito';
 echo $persona->saludar();
?>

Si te tiró un mensaje de error como: “Fatal error: Cannot access private property Persona::$nombre in…” está perfecto. Las propiedades son privadas y no deben ser accedidas desde el objeto, para eso definimos su valor desde el constructor. Acordate que las propiedades deberían ser casi siempre private. En muy pocos casos las propiedades son public (sinceramente ahora no se me ocurre ningún caso)

Ahora, ¿un método también puede ser private? Sí, por ejemplo algún método que se dispare dentro de otros métodos, pero nunca sea necesario llamarlo desde el objeto. Recordar que tanto las propiedades como los métodos al ser private no pueden ser accedidos desde el objeto, sólo dentro de la clase, sino PHP nos devolverá por pantalla un error como el de recién.

En realidad hay más niveles de acceso, protected y final, pero esos los veremos más adelante.

Bueno, hasta acá termino.

Saludos!

Anterior: Php orientado a objetos, parte 2: Método constructor y destructor

Siguiente: Php orientado a objetos, parte 4: Métodos getters y setters


2 Respuestas a “Php orientado a objetos, parte 3: Niveles de acceso”

  1. Excelente tutorial todo lo de objetos, eres buen maestro, tengo años usando PHP pero estructurado.

    Ojala e hicieras uno similar para JAVA, lo mas basico.

    Saludos desde Mexico!

    1. Gracias por el comentario.

      En realidad no tengo tanta experiencia en Java.

      Si me animo algún día hago uno.

      Saludos!