Modificadores de Visibilidade PHP: Public, Private e Protected

Public, Private, Protected, Final e Abstract: Os Modificadores de Visibilidade no PHP

Neste tutorial, vamos aprender as palavras-chave que permitem dar ao nosso código um comportamento especial relativo à segurança dos dados. Chamamos essas palavras de Modificadores de Visibilidade (ou Modificadores de Acesso).

Eles são os verdadeiros porteiros do seu sistema, determinando quem pode ler, gravar ou executar os métodos e atributos das suas classes. Dominar isso é o que separa um programador iniciante de um Desenvolvedor Pleno.

Qual a diferença entre Public, Private e Protected no PHP?
A diferença está no nível de acesso: Public permite que o atributo/método seja acessado de qualquer lugar do código. Private restringe o acesso apenas ao interior da própria classe onde foi declarado. Já o Protected permite o acesso dentro da própria classe e também pelas suas classes filhas (através de Herança).

Escopo Public: A Praça Pública

Quando você declara um atributo ou método com a palavra-chave public, está dizendo ao PHP que não há restrições. Ele pode ser acessado e alterado do lado de fora por qualquer pessoa, script ou entidade do seu sistema.


<?php
class Pessoa {
    // Escopo liberado para o mundo inteiro
    public $nome;
}

$alguem = new Pessoa();
// Qualquer parte do código consegue alterar a variável diretamente:
$alguem->nome = "Neil Peart";

echo "Nome da pessoa: " . $alguem->nome;
?>

Escopo Private: O Cofre Forte

O private é o nível de proteção mais recluso e paranóico do PHP. Um atributo ou método privado só pode ser acessado de dentro da própria classe que o criou. Nem mesmo um objeto instanciado ou uma classe herdeira consegue mexer nele.

Para ler ou definir um valor para esse atributo do lado de fora, somos obrigados a criar os famosos métodos Getters e Setters, como vimos na aula passada.


<?php
class Pessoa {
    // Trancado dentro da classe!
    private $cpf;

    // A única forma de alterar o CPF é usando este método interno
    public function setCpf($novoCpf) {
        $this->cpf = $novoCpf;
    }
}
?>

Escopo Protected: O Segredo de Família

Assim como os segredos que ficam apenas entre parentes, o protected é um meio-termo fantástico. Se você usa o private, ele bloqueia tudo. Mas, e se você quiser que as classes filhas (que herdam da classe pai) possam acessar essa variável, mas o resto do mundo não?

Para isso, usamos a palavra-chave protected.


<?php
class Funcionario {
    // Protegido! Só a própria classe e suas filhas enxergam isso
    protected $salario;
}

class Diretor extends Funcionario {
    public function mostrarSalario() {
        // Funciona! Porque Diretor é "filho" de Funcionario
        return $this->salario; 
    }
}
?>

Modificadores Estruturais: Final e Abstract

Além dos três níveis de visibilidade (Public, Private, Protected), o PHP possui modificadores que ditam as regras de herança. Vamos corrigir um mito comum: no PHP, a palavra final é usada para Métodos e Classes, e não para variáveis comuns.

O Comportamento Final (Ponto Final)

Quando você marca uma classe ou um método como final, você está dizendo ao PHP: "Esta é a versão definitiva. Proíbo que qualquer outra classe tente herdar e sobrescrever este código!".

Isso é excelente para métodos de segurança matemática ou validação de senhas, impedindo que programadores juniores "quebrem" a segurança reescrevendo o método em uma classe filha.


<?php
class CoreBancario {
    // Nenhuma classe filha poderá criar o seu próprio método transferir()!
    final public function transferir() {
        echo "Lógica complexa e inalterável do banco.";
    }
}
?>

O Comportamento Abstract (O Contrato)

O abstract (Abstrato) é o exato oposto do Final. Ele força a criação de uma regra, mas não entrega a solução. Ele é declarado na classe pai, mas obriga as classes filhas a escreverem o código de fato.

Por exemplo, sabemos que todo animal emite um som, mas cada bicho tem um som diferente. Nós criamos a classe abstrata, mas deixamos o trabalho sujo para os herdeiros:


<?php
abstract class Animal {
    // Declaramos o método, mas sem abrir chaves { }. É só uma regra!
    abstract public function emitirSom();
}

class Leao extends Animal {
    // O PHP OBRIGA o leão a criar esse método, senão o site trava com Erro Fatal
    public function emitirSom() {
        echo "Roaar!";
    }
}
?>

Cansado de Apanhar para a Orientação a Objetos? 🎓

"Eu misturava tudo: Public, Private, Função... virava um espaguete. O capítulo de POO da Apostila Progressivo me ensinou a desenhar o banco de dados antes de programar. Minha lógica mudou da água pro vinho!" - Carlos Eduardo, Dev Full-Stack.

Dominar modificadores de acesso é o requisito número 1 para passar em entrevistas de emprego e construir APIs profissionais. Estude no seu tempo, acesse exemplos completos de sistemas reais de RH e loja virtual com nosso material oficial.

📥 Fazer Download da Apostila Completa
Capa digital da Apostila PHP Progressivo com fundo transparente

⚙️ Tabela Rápida de Resumo (Guarde Isso!)

Aqui está o "cheat sheet" definitivo para você nunca mais esquecer as regras de visibilidade no PHP:

Modificador Acessível pela Própria Classe? Acessível pelas Classes Filhas? Acessível pelo Objeto (Script externo)?
Public ✅ Sim ✅ Sim ✅ Sim
Protected ✅ Sim ✅ Sim ❌ Não
Private ✅ Sim ❌ Não ❌ Não

Aprenda Todo o Ecosistema (O Pacote Full-Stack) 🚀

O mercado não contrata quem sabe apenas PHP. O mercado contrata quem sabe linkar o Front-end (HTML, CSS e Javascript) com o Banco de Dados através do PHP. Leve nosso pacote completo com 7 Manuais Premium por um preço simbólico e alavanque a sua carreira hoje.

Mega Pack completo do Projeto Progressivo contendo apostilas de PHP, Java, C e Front-end

Perguntas Frequentes (FAQ) da Comunidade

O que acontece se eu não colocar nenhum modificador de visibilidade na classe?

No PHP moderno, se você declarar um método apenas como function teste(), a linguagem irá assumir por padrão que ele é Public. No entanto, as boas práticas corporativas (PSRs) exigem que o modificador seja sempre declarado explicitamente para evitar ambiguidades.

Existe a palavra final para atributos/propriedades no PHP?

Diferente do Java, o PHP não possuía a declaração de atributos como finais para torná-los constantes imutáveis no escopo do objeto tradicional. Para isso, utilizamos a palavra-chave readonly a partir do PHP 8.1, e a partir do PHP 8.1 também ganhamos as constantes finais de classe (final public const).

Nenhum comentário: