Public, Private e Protected em PHP: guia completo de encapsulamento

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Public, Private e Protected em PHP: por que sem eles seu código é um caos?

\n\n

Imagine que você está construindo uma casa. Você tem uma porta da frente (todos podem entrar), um quarto com fechadura (apenas para a família) e um cofre na parede (só você tem acesso). No mundo da programação orientada a objetos (POO) em PHP, essas "portas" e "fechaduras" são chamadas de modificadores de acesso.

\n\n

Se você já escreveu classes em PHP, com certeza já se deparou com as palavras public, private e protected. Mas o que elas realmente significam? Por que não podemos simplesmente usar public em tudo e viver em paz? A resposta é simples: sem elas, seu código vira uma porta de entrada, onde qualquer script pode acidentalmente quebrar a lógica do programa.

\n\n

Neste artigo, vamos explorar os modificadores de acesso em PHP com exemplos reais, entender a diferença entre eles e aprender a usá-los para criar um código robusto e flexível. Este guia foi baseado em uma pergunta popular do Stack Overflow e adaptado para o site educacional pythonlib.ru.

\n\n

O que são modificadores de acesso e para que servem?

\n\n

Modificadores de acesso são palavras-chave que definem de onde é possível acessar as propriedades e métodos de uma classe. Eles são a base do encapsulamento (um dos quatro pilares da POO). O encapsulamento esconde o funcionamento interno do objeto e protege os dados contra uso incorreto.

\n\n

Em PHP, existem três níveis de acesso:

\n\n
    \n
  • Public — acessível a todos (dentro e fora da classe).
  • \n
  • Private — acessível apenas dentro da própria classe.
  • \n
  • Protected — acessível dentro da classe e em classes filhas (herança).
  • \n
\n\n

Vamos analisar cada um com exemplos práticos.

\n\n

Public: "Entrada sem bater"

\n\n

O modificador public é o mais aberto. Propriedades e métodos declarados como public podem ser lidos e alterados de qualquer lugar: de outra classe, de um script global, do espaço sideral (brincadeira).

\n\n
<?php\nclass Carro {\n    public $marca = 'Toyota';\n\n    public function buzinar() {\n        return 'Bip!';\n    }\n}\n\n$meuCarro = new Carro();\necho $meuCarro->marca; // Toyota — funciona\n$meuCarro->marca = 'Honda'; // Alterando — funciona\necho $meuCarro->buzinar(); // Bip!\n?>
\n\n

Parece conveniente, certo? Mas há um problema. Imagine que na classe Usuario exista uma propriedade public $senha. Qualquer código externo pode lê-la e alterá-la. Isso é um desastre para a segurança.

\n\n

Quando usar: para métodos que fazem parte da API pública da classe (por exemplo, getNomeUsuario()) ou para constantes.

\n\n

Private: "Cofre impossível de arrombar"

\n\n

O modificador private é o oposto completo do public. Uma propriedade ou método é acessível apenas dentro da classe onde foi declarado. Nem mesmo classes filhas (herança) conseguem ver os membros private do pai.

\n\n
<?php\nclass ContaBancaria {\n    private $saldo = 1000;\n\n    private function calcularJuros() {\n        return $this->saldo * 0.05;\n    }\n\n    public function getSaldo() {\n        return $this->saldo;\n    }\n\n    public function aplicarJuros() {\n        $this->saldo += $this->calcularJuros();\n    }\n}\n\n$conta = new ContaBancaria();\n// echo $conta->saldo; // Erro! Cannot access private property\n// echo $conta->calcularJuros(); // Erro! Cannot access private method\necho $conta->getSaldo(); // 1000 — funciona, porque o método é public\n$conta->aplicarJuros();\necho $conta->getSaldo(); // 1050\n?>
\n\n

Neste exemplo, $saldo e calcularJuros() estão ocultos do mundo externo. Controlamos o saldo apenas através dos métodos públicos getSaldo() e aplicarJuros(). Isso é o encapsulamento.

Blogs

Book Recommendations