PHP5 Orientado a Objetos: Visibilidade, herança e extensões de classes

Este artigo tratará sobre visibilidade, herança e extensão de classes (PHP Orientado a Objetos) com uma linguagem simples e de fácil entendimento, voltada principalmente para aqueles que desejam iniciar sua aventura no PHP-OO.

[ Hits: 33.585 ]

Por: EVERTON DA ROSA em 08/06/2009 | Blog: http://everton3x.github.io


Começando a entender visibilidade



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.

Página anterior     Próxima página

Páginas do artigo
   1. Introdução
   2. Começando a entender visibilidade
   3. Primeiros passos na visibilidade de métodos
   4. Estendendo classes
   5. Conhecendo mais a extensão de classes
   6. Resumo e conclusão
Outros artigos deste autor

PHP Orientado a Objetos: Para quem está começando

Utilizando endereços personalizados no seu servidor web: passo-a-passo

SLiM: Simple Login Manager - Mini review

Considerações sobre as distribuições

Relatórios com PHP e XSLT - Conceitos iniciais e utilização básica

Leitura recomendada

Organizando projetos com a classe FastTemplate (parte 1)

Administrando usuários no GNU/Linux e Samba via web com PHP

Organizando projetos com a classe FastTemplate (parte 2)

Polimorfismo e PHP 5

Utilizando PEAR

  
Comentários
[1] Comentário enviado por removido em 08/06/2009 - 15:44h

Muito bom o artigo Everton, está de parabéns!

[2] Comentário enviado por will fernando em 11/07/2009 - 09:16h

Muito bom ! Parabéns !

[3] Comentário enviado por wm em 16/07/2009 - 07:16h

excelente artigo

[4] Comentário enviado por henbran em 26/05/2010 - 08:53h

Bom Dia.
ESTOU COM UMA DÚVIDA EM HERANÇA EXTENDS

tenho 1 classe:
___________________________________
class A{
public function funcaoA(){
//detalhes
}
}
ººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººº

Então tenho outra classe:
___________________________________
class B extends A{
public function funcaoA(){
//detalhes
}
}
¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨
Quando tento instanciar a classe B, sendo estendida da classe A, não instancia.
ex. $instanciaB = new B(); // não funciona.
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Se tiro o extends A da declaração da classe B (ficando assim: class B{ ... }), então instancia.
................................................................................................................
Já cheguei a testar todas as classes vazias, tentando saber se haveria algo de errado com as functions, porém mesmo assim continua no mesmo problema.
*******************************************************************************************
POR FAVOR, COMO EU DEVERIA FAZER ENTÃO???

[5] Comentário enviado por concurso em 08/10/2012 - 13:29h

Incrível o conteúdo, bem elaborado e explicado!

Estou iniciando na prática em php, espero que dê tudo certo.rs

Tem mais conteúdo de php elaborado por ti?

[6] Comentário enviado por everton3x em 18/10/2012 - 08:40h

Obrigado pelo comentário concurso.
Tem mais material sim. É só procurar na lista de artigos do meu perfil http://www.vivaolinux.com.br/perfil/verPerfil.php?login=everton3x


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts