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: 34.230 ]

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


Primeiros passos na visibilidade de métodos



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.

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

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

SLiM: Simple Login Manager - Mini review

SliTaz: Mini-review desta mini-distribuição Linux

ExtJS: Um excelente framework de JavaScript

Utilizando PHP para validar dados passados pelo usuário

Leitura recomendada

Organizando projetos com a classe FastTemplate (parte 1)

Usando Blocos Dinâmicos com a Classe FastTemplate (Parte 2)

Aumente sua produção em PHP

Utilizando PEAR

Trabalhando conteúdo dinâmico com Smarty

  
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