Public, Private e Protected em PHP: por que sem eles seu código é um caos?
\n\nImagine 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\nSe 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.
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\nO que são modificadores de acesso e para que servem?
\n\nModificadores 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\nEm 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
Vamos analisar cada um com exemplos práticos.
\n\nPublic: "Entrada sem bater"
\n\nO 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).
<?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\nParece 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.
Quando usar: para métodos que fazem parte da API pública da classe (por exemplo, getNomeUsuario()) ou para constantes.
Private: "Cofre impossível de arrombar"
\n\nO 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.
<?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\nNeste 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.