Passaremos agora a estudar a visibilidade dos métodos, porém apenas os níveis public e protected. O nível private ficará para estudarmos junto com o tema extensão de classes e herança.
Tomemos novamente o código da nossa classe:
class MensagemSimples {
protected $titulo;
protected $texto;
function setTitulo($valor){
$this->titulo = $valor;
}
function setTexto($valor){
$this->texto = $valor;
}
function printTitulo(){
echo $this->titulo;
}
function printTexto(){
echo $this->texto;
}
}
$msg = new MensagemSimples; // Criamos o objeto instanciando a classe.
// 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();
Vemos que as propriedades estão definidas como protected, porém os métodos não tem definição nenhuma. Isso significa que eles são public, pois quando não se determina nenhum nível de visibilidade, o nível atribuído é o public.
Vamos supor que queiramos que os métodos setTexto() e setTitulo() sejam protected, faríamos a seguinte alteração:
protected function setTitulo($valor){
$this->titulo = $valor;
}
protected function setTexto($valor){
$this->texto = $valor;
}
Se tentarmos executar agora o nosso script, receberíamos a seguinte mensagem:
"Fatal error: Call to protected method MensagemSimples::setTitulo() from context '' in E:\www\xampplite\htdocs\tutoriais\tutorial.php-oo.visibilidade-heranca-estensao.php on
line
32"
Isto significa que não mais podemos acessar os métodos setTitulo()e setTexto() a partir de fora da classe.
Mas como vamos acessá-los então?
Para isso devemos fazer uma pequena modificação na nossa classe:
protected function setTitulo($valor){
$this->titulo = $valor;
}
protected function setTexto($valor){
$this->texto = $valor;
}
function printTitulo($valor){
$this->setTitulo($valor);
echo $this->titulo;
}
function printTexto($valor){
$this->setTexto($valor);
echo $this->texto;
}
Note que adicionamos o parâmetro $valor aos métodos printTitulo() e printTexto() e que dentro dos métodos printTitulo() e printTexto() chamamos os métodos setTitulo() e setValor().
O teste do nosso script também deve mudar:
$msg = new MensagemSimples; // Criamos o objeto instanciando a classe.
// Recuperando os valores das propriedades.
$msg->printTitulo('Título da mensagem');
echo '<br>';
$msg->printTexto('Mensagem de teste.<br>Testando a visibilidade das propriedades.');
Isso nos exibirá no navegador, novamente:
Título da mensagem
Mensagem de teste.
Testando a visibilidade das propriedades.
O que fizemos é basicamente chamar os métodos print, passando-lhes os valores desejados e estes métodos chamam os métodos set passando-lhes os valores recebidos e depois imprimem os valores atribuídos pelos métodos set.
Alerto que isto é somente um exemplo didático e que na prática não faríamos desta forma. Isso é apenas para aprendermos a utilizar a visibilidade.