Visibility Property or Method in PHP
Autor: vicentimartins | Publicado: 2011-09-19T22:01:00-03:00



Boa noite pessoal, estava estudando um pouco de OOP, relembrando o lance das visibilidades das propriedades e métodos em php, e resolvi escrever algo sobre.



Bem, para determinar a visibilidade de uma propriedade (lê-se variáveis e/ou constantes) utiliza-se as palavras reservadas Public, Protect e Private. Uma outra forma de tratarmos o acesso aos métodos e propriedades em PHP, é utilizando o token static, mas deste falaremos em um segundo post sobre este assunto. Se declararmos uma variável do tipo...



var $a = array(1,2,3,4,5);



... em um método qualquer, saibam que $a vai ser uma propriedade pública, ou seja, quando não informamos o nível de acesso, ou visibilidade de uma propriedade em PHP, o próprio PHP cria aquela propriedade como sendo Public. O mesmo acontece com os métodos. Métodos em PHP são lidos como funções, então no caso de eu ter um método....



funcition testVisibility($a){

&nbsp; &nbsp;//... muitas linhas de código aqui....

}



... da mesma forma que no caso das propriedades, o método testVisibility($a) vai ser um método público.



Mas o qual a utilidade de utilizar a visibilidade dos métodos e propriedades?



Bem, responder a pergunta não é tão complicado quanto falar dos benefícios que trazem. Visibilidade ou acesso, é fundamental quando se fala em encapsulamento.

Uma propriedade ou um método public, pode ser acessado a qualquer instante de qualquer lugar do sistema, bastando ser criado uma instancia da classe que o possui.

Uma propriedade ou método protect, pode ser acessado na classe que o possui, bem como nas classes que herdam da classe que possui o método.

Já as propriedades ou métodos private, só podem ser acessados pela própria classe que a possui.

É pensando nisso que utilizamos métodos acessadores e/ou modificadores, os famosos Getters e Setters. Através destes métodos, poderemos acessar os valores das propriedades(método getProperty()), ou modificá-los (utilizando método setProperty($property)) sem na verdade tocar na nossa $property.

Parece complicado, mas não o é (pelo menos agora parece ser mais fácil!). Suponhamos que tivéssemos a situação...

public class Dog{
&nbsp; &nbsp; private $size;
&nbsp; &nbsp; private $name;
&nbsp; &nbsp; private $breed;

... como acessar os valores de $size, $name ou $breed se estas propriedades são privadas? É aí que entra o método acessador get, no caso...


public class Dog{
&nbsp; &nbsp; private $size;
&nbsp; &nbsp; private $name;
&nbsp; &nbsp; private $breed;



&nbsp; &nbsp; public function getSize(){

&nbsp; &nbsp; &nbsp; &nbsp;return $this-&gt;size;

&nbsp; &nbsp; }



&nbsp; &nbsp; public function getName(){

&nbsp; &nbsp; &nbsp; &nbsp; return $this-&gt;name;

&nbsp; &nbsp; }



&nbsp; &nbsp; public function get Breed(){

&nbsp; &nbsp; &nbsp; &nbsp; return $this-&gt;breed;

&nbsp; &nbsp; }



... e assim temos os valores retornados de cada uma das propriedades sem precisar acessar, de verdade, as propriedades.



Se os métodos Getters servem para acessar os valores das propriedades, os método modificadores Setters, servem para modificarmos (setar um valor para aquela propriedade) as propriedades. No caso ficaria...



public class Dog{
&nbsp; &nbsp; private $size;
&nbsp; &nbsp; private $name;
&nbsp; &nbsp; private $breed;



&nbsp; &nbsp; public function setSize($size){

&nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;size= $size;

&nbsp; &nbsp; }



&nbsp; &nbsp; public function setName($name){

&nbsp; &nbsp; &nbsp; &nbsp; $this-&gt;name= $name;

&nbsp; &nbsp; }



&nbsp; &nbsp; public function getBreed($breed){

&nbsp; &nbsp; &nbsp; &nbsp; $this-&gt;breed= $breed;

&nbsp; &nbsp; }




... e isso nos permitiria alterar os valores de $size, $name, e $breed sem de fato alterarmos os valores de breed.

Uma segunda vantagem é que mesmo tendo $size, $name e $breed como propriedades privadas da classe Dog(), elas poderiam ser "acessadas" por qualquer objeto que instanciasse Dog() através dos métodos get, bem como, poderíamos colocar diversos valores para diversas instâncias de Dog() utilizando os métodos set, mesmo estas propriedades sendo privadas.

Não sei se notaram, mas quando utilizo o encapsulamento, tenho um operador que é chave no processo, a pseudo-variável $this-&gt;, que é uma variável de referencia para os objetos.



Bem, acho que a mensagem foi passada. Recomendo muito aprofundar os estudos na OOP, é de muita utilidade.



Abraço a todos.