Pular para o conteúdo

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.
EVERTON DA ROSA everton3x
Hits: 36.568 Categoria: PHP Subcategoria: Metodologias
  • Indicar
  • Impressora
  • Denunciar

Parte 3: 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.

   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

Considerações sobre as distribuições

ExtJS: Um excelente framework de JavaScript

Utilizando PHP para validar dados passados pelo usuário

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

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

Organizando projetos com a classe FastTemplate (parte 1)

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

Utilizando PEAR

Polimorfismo e PHP 5

Criando um ambiente de desenvolvimento web livre com Eclipse e PHP

#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?

Contribuir com comentário

Entre na sua conta para comentar.