• Início
  • Fórum
  • Serviços
  • Downloads
  • Wiki
  • Lista de sites vulneráveis
Fique por dentro

Modificadores de acesso

nov25
2010
11 Comentários Postado por Tiago Temporim

O que são modificadores de acesso?

Modificadores de acesso são os tipos de visibilidade que seu atributo ou método terá para o resto da aplicação. Por exemplo, um atributo de visibilidade public poderá ter seu conteúdo modificado ou recuperado por qualquer outra classe.

Os modificadores de acesso podem ser do tipo public, private ou protected.

Tipo Public

O tipo public, como o próprio nome já diz, é publico e pode ser alterado por qualquer classe sem a utilização de um método para fazer. Exemplo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
    class pessoa{

         public $nome;            
         protected $cpf;
         private $rg;

         public function __construct(){

         }
    }

    $pessoa = new pessoa();
    $pessoa->nome = 'Tiago Temporim';

    echo $pessoa->nome; //exibirá Tiago Temporim
?>

Tipo Protected

Os modificadores do tipo protected podem ser visualizados ou modificados pela própria classe ou suas filhas. Assim se seu atributo for do tipo protected e você tentar fazer o código acima, retornará um erro. No caso de atributos, você só conseguirá acessar se utilizar um método publico como mostrarei logo abaixo no modificador do tipo private.
Exemplo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
   <?php
        class pessoaFisica extends pessoa{
           
            public function __construct(){
                $pessoa = new pessoa();        
                $pessoaFisica->cpf = '000.000.000-00';
            }
        }

         $pessoaFisica = new pessoaFisica();
         $pessoaFisica->nome = 'Tiago Temporim';

         echo $pessoaFisica->nome; //Exibirá Tiago Temporim;
    ?>

Tipo Private

Modificadores do tipo private só podem ser visualizados e alterados pela própria classe, nem a classe filha pode acessar esse tipo de atributo ou método. Exemplo:

1
2
3
4
5
6
7
8
9
10
   <?php

         $pessoaFisica = new pessoaFisica();
         $pessoaFisica->rg = '00.000.000-00';
         //Retorna erro!

         $pessoa = new pessoa();
         $pessoa->rg = '00.000.000-00';
         //Retorna erro!
    ?>

Não, eu não escrevi errado é isso mesmo. Para que você possa atribuir um valor para aquele atributo, deve ser utilizado métodos da classe. Vejamos:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
    class pessoa{

         public $nome;            
         protected $cpf;
         private $rg;

         public function __construct(){

         }

         public function setRg($rg){
             $this->rg = $rg;
         }

         public function getRg(){
             return $this->rg;
         }
    }

    $pessoa = new pessoa();
    $pessoa->setRg('00.000.000-00');

    echo $pessoa->getRg(); //exibirá 00.000.000-00
?>

Agora com esses métodos implementados na classe eu posso através da classe filha utilizar eles para modificar o valor do atributo sem problemas.
Mais qual a diferença então?
É simples, dentro da classe pessoa o atributo $rg pode ser utilizado sem os métodos de acesso, enquanto na classe filha pessoaFisica não é possível realizar este feito.

Espero que eu tenha sido claro e tenha ajudado.

Caso tenham alguma dúvida, entrem no fórum, na sessão Dúvidas e criem um tópico para que eu possa ajudar o máximo possível no entendimento.

Até a próxima!

Postado em Artigos - Tagged Orientação a objetos
SHARE THIS Twitter Facebook Delicious StumbleUpon E-mail
« Segurança no PHP – SQL injection
» Interfaces
  • Pingback: junichi_y

  • Marcos

    Ao invez de voce fazer isto aqui
    public function __construct(){
    $pessoa = new pessoa();
    }
    Pois voce esta herdando da classe pessoa entao ja possui o contrutor dela basta apenas chamo-lo como abaixo

    class PessoaJurifica extends Pessoa{
    function __construct() {
    parent::__construct();
    }

    getRg é um metodo portando precisa de getRg(), pois do jeito que esta, ao meu ver diz que é um atributo de classe e não um metodo
    echo $pessoa->getRg; //exibirá 00.000.000-00

    bom quanto ao modificares de acesso
    private – so pode ser visto na propria classe
    protected – pode ser visto na propria classe e nas classes filhas
    public – todo mundo tem acesso aos, desde que faca a intancia ou herda a classe

    • Tiago Temporim

      Sim o método construtor pode ser feito das 2 formas.
      A questão da $pessoa->getRg() foi falha minha na hora de digitar, obrigado por chamar a atenção.

  • http://nosqlbr.com.br Suissa

    Lembrando que atributos publicos sao completamente des-aconselhaveis.

  • http://felipebastosweb.com.br felipe bastos

    Não entendi Tiago ..

    isso ..

    public function __construct(){
    $pessoa = new pessoa();
    }

    não funciona da mesma forma que isto..

    function __construct() {
    parent::__construct();
    }

    No primeiro caso, $pessoa vai para o Garbage Collection após __construct terminar .. Ou seja, os valores setados no construtor de pessoa não são passados para pessoafisica .. E no segundo caso, a referência parent garante que será passado para o objeto que está sendo instanciado.

    • Tiago Temporim

      Entendi o que você quis dizer, mas já usei das 2 formas e consegui trabalhar normalmente com a classe..
      O que você falou faz sentido, não deveria funcionar. Vou pesquisar certinho o por que ela funciona mesmo assim e depois coloco a resposta aqui.

  • http://www.gilcezar.wordpress.com Gil Cezar C. Gonçalves

    Parabenizo o autor pela iniciativa do projeto(web site), qualquer açao que tenha por base divulgar e incetivar o PHP e as tecnologias relaçionadas são louvaveis. Notei nos cometários deste post algumas críticas com um certo tom de menosprezo ou tentativa de contestar o conhecimento do autor do post, devemos respeitar aos que de certa forma se expoem e se colocam a frente para tentar compartilhar uma informação. Mas fica ainda um conselho para o autor ou a quem mais possa interessar: Ao escrever sobre algo com algum tema de interesse geral ou até mesmo de temas pouco conhecidos(novos), procure por referências que fundamentem sua idéia, isso tornará seus artigos mais profissionais. Divergências sempre existirão, principalmente em se tratando de uma linguagem livre e dinâmica como PHP, mas criticar não siginifica ofender, defendamos nosso ponto de vista com enbasamento e sem desrespeitar ninguém, e tornando essa critica em oportunidade de compartilhar conhecimentos.

  • Sidney

    Concordo com o comentário do Gil Cezar e também parabenizo pela iniciativa que foi muito boa. É verdade que existe bastante material sobre este assunto específico, mas ter essa iniciativa significa que mais pra frente poderá postar outros assuntos significativos sobre PHP e isso é bem legal. Parabéns.

    Sem nenhum menosprezo nem nada do gênero, apenas adicionando uma informaçao que pode ser útil, gostaria de mencionar que chamar o recurso parent::__construct() neste caso não seria útil. Ele poderia simplesmente ser deixado de fora. Isso porque mesmo que eu futuramente venha a definir algo no construct pai, o filho já o herdará automaticamente. Isso seria aplicável somente se eu for fazer algo no construct do filho. Aí sim eu deveria chamar o parent::__construct() pois caso contrário estaria sobrescrevendo totalmente o método na classe pai.

    Mais uma vez, parabéns pela iniciativa. Muitos tem mutio conhecimento mas não tem a iniciativa (ou talvez tempo/recursos) de fazer isso.

    Abraço

  • http://www.aprenderphp.com.br/ Mauro George

    Parabéns pelo artigo. Só uma observação.

    Não podemos fazer:

    $pessoaFisica->cpf = ’000.000.000-00′;

    Devido ao atributo ter sido declarado como protected sendo assim ele só pode ser acessado pela classe em que foi criado e pela classe filha, e não pelo objeto, instancia, gerado a partir da classe filha. Sendo assim um dos modos de atribuirmos valor ao CPF seria no construtor de pessoaFisica em que colocaríamos assim:

    $pessoa = new pessoa();
    $pessoa->cpf = ’000.000.000-00′;

    Ou ainda utilizariamos a mesma lógica de RG uttilizando setCpf e getCpf.

    Excelente artigo.
    Abraço

    • http://www.portalphp.org Tiago Temporim

      Verdade, falha minha.
      Já corrigi, obrigado Mauro.

  • http://www.aprenderphp.com.br/ Mauro George

    Desculpe,

    Mais completando o comentário antrior ainda pode se utilizar, na classe pessoaFisica, de:

    public function __construct(){
    $pessoa = new pessoa();
    $this->cpf = 250;
    }
    Pois ela herda de pessoa. Sendo assim não necessitamos definir o CPF na instancia de pessoa pois ao herdar a classe pessoaFisica agora possui o atributo CPF, teríamos que definir na instancia apenas se estivéssemos utilizando de composição ou agregação.

    Abraço e desculpe ter esquecido de complementar no outro comentário

Newsletter

enviando...
Nome
Email

Ajude a pagar o café

Nós não cobramos pelo conhecimento aqui passado, porém se você sentir vontade de nos ajudar com o café e a hospedagem, sinta-se a vontade para doar a quantidade que quiser.

facebook

Posts Recentes

  • Configurando Ambiente de Desenvolvimento em PHP no Linux.
  • Downloads e Wiki
  • Paginação e Ordenação
  • Visualizando registros do DB
  • Excluindo registros do banco de dados com CakePHP 2.0

Categorias

  • Artigos
  • CMS
  • Destaques
  • Dicas
  • Eventos
  • Frameworks
  • Notícias
  • PHP
  • Tutoriais
  • Video Aulas

Tags

Agregação Associação automático banco de dados bibliotecas BuddyPress CakePHP Composição configuração Cookies CURL description Dicas especialização exceptions facebook final Generalização hacker cup Herança importação Joomla mapeamento mvc namescpaces objeto openinviter Orientação a objetos permalink persistência de dados php Polimorfismo regex rss segurança Sessions Sessões Smarty SPL Template title Tutorial Vídeo aula wordpress youtube

RSS

  • Posts
  • Comentários

Amigos do Portal

  •  
  • Fernando Valente
  • jQDOM
  • Blog do Suissa
  • PHP Brasil Comunidades
  • PHP MS

Listas de PHP

  • PHPMS
  • GOPHP
  • PHP Avançado
  • PHP MG
  • PHP Paraíba
  • PHP Rio
  • PHP AC
  • PHP-Brasil
  • PHP Curitiba
  • PHP-GTK Brasil
  • PHP-MySQL-BR
  • PHPBA
  • PHPeMySQL

EvoLve theme by Blogatize  •  Powered by WordPress Portal PHP
Só mais um site WordPress