Menu
Coddy logo textTech

Propriedades Privadas e Protegidas

Parte da seção Programação Orientada a Objetos do Journey de PHP da Coddy — lição 18 de 91.

Até agora, usamos propriedades public que podem ser acessadas de qualquer lugar. Mas às vezes você precisa restringir o acesso para proteger seus dados. O PHP fornece dois modificadores de visibilidade adicionais: private e protected.

Uma propriedade private só pode ser acessada de dentro da classe que a define:

<?php
class BankAccount {
    private $balance = 0;
    
    public function deposit($amount) {
        $this->balance += $amount;
    }
    
    public function getBalance() {
        return $this->balance;
    }
}

$account = new BankAccount();
$account->deposit(100);
echo $account->getBalance();

Saída:

100

Tentar acessar $account->balance diretamente de fora da classe causaria um erro. Isso protege o saldo de ser alterado sem passar pelo método deposit.

Uma propriedade protected funciona de forma semelhante, mas também pode ser acessada por classes filhas que estendem a classe pai:

<?php
class User {
    protected $email;
    
    public function __construct($email) {
        $this->email = $email;
    }
}

class Admin extends User {
    public function showEmail() {
        return $this->email;
    }
}

$admin = new Admin("admin@example.com");
echo $admin->showEmail();

Saída:

admin@example.com

Ponto Chave: Use private quando apenas a classe que define deve acessar a propriedade. Use protected quando as classes filhas também precisam de acesso. Ambos impedem o acesso externo direto, mantendo o estado interno do seu objeto seguro.

challenge icon

Desafio

Fácil

Vamos construir um sistema seguro de gerenciamento de funcionários que demonstra como proteger dados sensíveis usando propriedades privadas e protegidas.

Você criará três arquivos que trabalham juntos para gerenciar informações de funcionários com controle de acesso adequado:

  • Employee.php — Defina uma classe Employee que serve como base para todos os funcionários. Ela deve ter uma propriedade protected $name (para que as classes filhas possam acessá-la) e uma propriedade private $salary (apenas esta classe deve modificar salários diretamente). O construtor aceita um nome e um salário, definindo ambas as propriedades. Adicione um método público getName() que retorna o nome, um método público getSalary() que retorna o salário e um método público giveRaise($amount) que aumenta o salário pelo valor fornecido.
  • Manager.php — Defina uma classe Manager que estende Employee. Inclua o arquivo Employee no topo. Adicione uma propriedade privada $department. O construtor deve aceitar nome, salário e departamento — chame o construtor pai para nome e salário, depois defina o departamento. Crie um método getDetails() que retorna "[name] manages [department]" acessando a propriedade protegida $name diretamente. Adicione também um método getDepartment() que retorna o departamento.
  • main.php — Inclua ambos os arquivos de classe. Crie um Manager com o nome "Sarah", salário 75000 e departamento "Engineering". Imprima os detalhes do gerente usando getDetails(). Em seguida, dê ao gerente um aumento de 5000 e imprima seu novo salário usando getSalary(). Cada saída deve estar em sua própria linha.

Observe como a classe Manager pode acessar a propriedade protegida $name diretamente, mas deve usar o método getSalary() para acessar o salário privado. Isso demonstra a diferença fundamental entre a visibilidade protegida e privada — o acesso protegido permite o acesso da classe filha, enquanto o privado mantém os dados verdadeiramente ocultos.

Folha de consulta

O PHP fornece três modificadores de visibilidade para propriedades de classe:

  • public — acessível de qualquer lugar
  • private — acessível apenas dentro da classe que a define
  • protected — acessível dentro da classe que a define e em classes filhas

Propriedades privadas:

class BankAccount {
    private $balance = 0;
    
    public function deposit($amount) {
        $this->balance += $amount;
    }
    
    public function getBalance() {
        return $this->balance;
    }
}

Propriedades privadas não podem ser acessadas diretamente de fora da classe. Use métodos públicos para interagir com elas.

Propriedades protegidas:

class User {
    protected $email;
    
    public function __construct($email) {
        $this->email = $email;
    }
}

class Admin extends User {
    public function showEmail() {
        return $this->email; // Classe filha pode acessar a propriedade protegida
    }
}

Propriedades protegidas podem ser acessadas por classes filhas que estendem a classe pai.

Quando usar:

  • Use private quando apenas a classe que a define deve acessar a propriedade
  • Use protected quando as classes filhas também precisarem de acesso
  • Ambos impedem o acesso externo direto, protegendo o estado interno do objeto

Experimente você mesmo

<?php
require_once 'Employee.php';
require_once 'Manager.php';

// TODO: Criar um Gerente com o nome "Sarah", salário 75000 e departamento "Engineering"

// TODO: Imprimir os detalhes do gerente usando getDetails()

// TODO: Dar ao gerente um aumento de 5000

// TODO: Imprimir o novo salário usando getSalary()
?>
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Programação Orientada a Objetos