Modificadores de acceso a métodos y propiedades en PHP5

  • Por
  • PHP
Son los Public, Protected y Private, que pueden conocerse porque ya se utilizan en otros lenguajes orientados a objetos.

Veremos en este capítulo los nuevos modificadores de acceso a los métodos y atributos de los objetos que se han incorporado en PHP 5. Estos modificadores de acceso no son otros que los conocidos public, protected y private, que ya disponen otros lenguajes como Java.

Uno de los principios de la programación orientada a objetos es la encapsulación, que es un proceso por el que se ocultan las características internas de un objeto a aquellos elementos que no tienen porque conocerla. Los modificadores de acceso sirven para indicar los permisos que tendrán otros objetos para acceder a sus métodos y propiedades.

Modificador public

Es el nivel de acceso más permisivo. Sirve para indicar que el método o atributo de la clase es público. En este caso se puede acceder a ese atributo, para visualizarlo o editarlo, por cualquier otro elemento de nuestro programa. Es el modificador que se aplica si no se indica otra cosa.

Veamos un ejemplo de clase donde hemos declarado como public sus elementos, un método y una propiedad. Se trata de la clase "dado", que tiene un atributo con su puntuación y un método para tirar el dado y obtener una nueva puntuación aleatoria.

class dado{ 
   	public $puntos; 

   	function __construct(){ 
      	srand((double)microtime()*1000000); 
   	} 

   	public function tirate(){ 
      	$this->puntos=$randval = rand(1,6); 
   	} 
} 

$mi_dado = new dado(); 

for ($i=0;$i<30;$i++){ 
   	$mi_dado->tirate(); 
   	echo "<br>Han salido " . $mi_dado->puntos . " puntos"; 
}

Vemos la declaración de la clase dado y luego unas líneas de código para ilustrar su funcionamiento. En el ejemplo se realiza un bucle 30 veces, en las cuales se tira el dado y se muestra la puntuación que se ha obtenido.

Como el atributo $puntos y el método tirate() son públicos, se puede acceder a ellos desde fuera del objeto, o lo que es lo mismo, desde fuera del código de la clase.

Modificador private

Es el nivel de acceso más restrictivo. Sirve para indicar que esa variable sólo se va a poder acceder desde el propio objeto, nunca desde fuera. Si intentamos acceder a un método o atributo declarado private desde fuera del propio objeto, obtendremos un mensaje de error indicando que no es posible a ese elemento.

Si en el ejemplo anterior hubiéramos declarado private el método y la propiedad de la clase dado, hubiéramos recibido un mensaje de error.

Aquí tenemos otra posible implementación de la clase dado, declarando como private el atributo puntos y el método tirate().

class dado{ 
   	private $puntos; 

   	function __construct(){ 
      	srand((double)microtime()*1000000); 
   	} 

   	private function tirate(){ 
      	$this->puntos=$randval = rand(1,6); 
   	} 

   	public function dame_nueva_puntuacion(){ 
      	$this->tirate(); 
      	return $this->puntos; 
   	} 
} 

$mi_dado = new dado(); 

for ($i=0;$i<30;$i++){ 
   	echo "<br>Han salido " . $mi_dado->dame_nueva_puntuacion() . " puntos"; 
}

Hemos tenido que crear un nuevo método público para operar con el dado, porque si es todo privado no hay manera de hacer uso de él. El mencionado método es dame_nueva_puntuación(), que realiza la acción de tirar el dado y devolver el valor que ha salido.

Modificador protected

Este indica un nivel de acceso medio y un poco más especial que los anteriores. Sirve para que el método o atributo sea público dentro del código de la propia clase y de cualquier clase que herede de aquella donde está el método o propiedad protected. Es privado y no accesible desde cualquier otra parte. Es decir, un elemento protected es público dentro de la propia clase y en sus heredadas.

Más adelante explicaremos la herencia y podremos ofrecer ejemplos con el modificador protected.

Conclusión

Muchas veces el propio desarrollador es el que fija su criterio a la hora de aplicar los distintos modificadores de acceso a atributos y métodos. Poca protección implica que los objetos pierdan su encapsulación y con ello una de las ventajas de la POO. Una protección mayor puede hacer más laborioso de generar el código del programa, pero en general es aconsejable.

Autor

Miguel Angel Alvarez

Miguel es fundador de DesarrolloWeb.com y la plataforma de formación online EscuelaIT. Comenzó en el mundo del desarrollo web en el año 1997, transformando su hobby en su trabajo.

Compartir

Comentarios

Eric Pietra

02/4/2005
Excelente articulo, creo que vale la pena que optimicemos para esta nueva version y veremos si el hosting de www.sistemas-futuros.com soporta PHP 5 o siguen con el 4

hans

23/1/2007
escelente articulo es una gra mirada hacia el futuro y un gran aporte para las personas que queremos aprender de forma autodidacta ojala sigan asi son lo mejor en la web y sobre todo porke persiguen la libertad de la informacion para que todos por igual puedan seguir creciendo graciasssss...

luis h

17/4/2009
LuisH
oye, para los atributos privados supuestamente no se pueden acceder en otras clases aunque esten eredadas, unicmente si estan como protegidas,
pero:

si haces:

class pro{
private variable1;

}

class pro2 extends pro{
function mostrar(){
this->variable1 = "hola";
}
}

$a = new pro2();
$a->mostrar();

te va a imprimir hola,.


conclucion, ahora como le hago para que definitivamente las variables private sean privadas realmente para la clase donde estan definidas.

manticora

05/4/2010
funtion_-construct()
quisiera saber para que utilizaste el function __construct() donde se encuentra el microtime puesto que no lo utilizas para darle valor a un atributo,me gustaria saber para que lo empleaste en este programa

pablo

30/10/2012
buen artículo...
Ya había comenzado otro tutorial de php, y no lo tenía claro...Ahora si que lo tengo muy claro...

fabian_manzano

04/5/2013
Cual es el objetivo de la funcion __construct() en este ejemplo?
Me gustaria saber cual es el objetivo de la funcion __construct en este ejemplo?
si la elimino del codigo, el codigo funcioan perfectamente.
Gracias

Pablo Fonseca

22/11/2016
Muchas Gracias
Gracias por este gran artículo, me ha servido demasiado!