A primeira parte de nosso estudo envolverá o conceito de visibilidade de métodos e propriedades.
Mas para fazer isso primeiro precisamos de uma classe. É o que faremos primeiro: uma classe de exemplo com a qual trabalharemos a questão de visibilidade.
<?
/* Script tutorial sobre extensão, herança e visibilidade (PHP Orientado a Objetos).
* @author Everton3x (Everton da Rosa)
* @version 1.0
*/
class MensagemSimples {
public $titulo;
public $texto;
function setTitulo($valor){
$this->titulo = $valor;
}
function setTexto($valor){
$this->texto = $valor;
}
function printTitulo(){
echo $this->titulo;
}
function printTexto(){
echo $this->texto;
}
}
?>
Explicando a classe:
A classe MensagemSimples apenas gera uma mensagem composta por título e texto.
As propriedades $titulo e $texto armazenam o título e o texto da mensagem respectivamente.
Os métodos setTitulo() e setTexto() atribuem valores às propriedades $titulo e $texto.
Os métodos printTitulo()e printTexto() imprimem o título e o texto na tela do navegador.
É uma classe simples, praticamente sem função real, exceto a função didática necessária ao aprendizado.
Vamos agora a uma pequena explanação teórica.
Visibilidade é o nível de acesso que se dá a propriedades e métodos de uma classe. Ela tem três níveis que são determinados pela prefixação das palavras reservadas public, private ou protected antes da definição da propriedade ou do método.
Assim, temos:
- public define que o acesso à propriedade/método é acessível de qualquer lugar do script;
- protected define que o acesso somente pode ser feito pela classe que define a propriedade/método e por classes que herdam esses métodos/propriedades (é o que veremos ao estudar extensão de classes);
- private define o nível mais alto de controle de acesso, onde a propriedade/método somente pode ser acessado pela classe que o define.
No contexto deste artigo, acesso à propriedade ou método significa que ele pode ser utilizado ou ter seu valor modificado ou consultado.
Também, neste artigo, considera-se classe que define o método/propriedade como aquela que possui o código do método/propriedade.
Finda esta explanação teórica, vamos começar a brincar com nossa classe MensagemSimples para aprender sobre a visibilidade public e protected. A visibilidade private será abordada quando estudarmos a extensão e herança.
Notemos que antes das propriedades $titulo e $texto temos a palavra public. Isto significa que são propriedades públicas e podem ser acessadas de qualquer lugar do script.
Vamos a um exemplo:
$msg = new MensagemSimples; // Criamos o objeto instanciando a classe.
// Atribuindo valores às propriedades
$msg->titulo = 'Título da mensagem';
$msg->texto = 'Mensagem de teste.
Testando a visibilidade das propriedades.';
// Recuperando os valores das propriedades.
echo $msg-titulo.'<br>';
echo $msg->texto;
Colocando o código acima no final do nosso script e executando ele no navegador, teremos o seguinte resultado:
Título da mensagem
Mensagem de teste.
Testando a visibilidade das propriedades.
Agora veremos o que acontece se trocarmos a palavra public por private na propriedade $texto.
O resultado exibido pelo navegador será o seguinte:
"Fatal error: Cannot access protected property MensagemSimples::$texto in E:\www\xampplite\htdocs\tutoriais\tutorial.php-oo.visibilidade-heranca-estensao.php on line 33"
O que isso significa?
Significa que não é possível utilizar mais a propriedade $texto fora da classe MensagemSimples.
É justamente por isso que criamos os métodos setTitulo(), setTexto(), printTitulo() e printTexto().
Para utilizarmos nossa classe agora, teremos que substituir o código que não funcionou por este (troque antes o public da propriedade $titulo por protected):
// Atribuindo valores às propriedades
$msg->setTitulo('Título da mensagem');
$msg->setTexto('Mensagem de teste.<br>Testando a visibilidade das propriedades.');
// Recuperando os valores das propriedades.
$msg->printTitulo();
echo '<br>';
$msg->printTexto();
O resultado no navegador será o seguinte:
Título da mensagem
Mensagem de teste.
Testando a visibilidade das propriedades.
Viu como é fácil! Agora para utilizarmos as propriedades devemos fazer isso somente através da própria classe.
Se para as propriedades é possível selecionar níveis de visibilidade, para os métodos isso é possível?
Sim! É o que veremos agora.