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:
100Tentar 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.comPonto 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.
Desafio
FácilVamos 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 classeEmployeeque serve como base para todos os funcionários. Ela deve ter uma propriedadeprotected $name(para que as classes filhas possam acessá-la) e uma propriedadeprivate $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úblicogetName()que retorna o nome, um método públicogetSalary()que retorna o salário e um método públicogiveRaise($amount)que aumenta o salário pelo valor fornecido.Manager.php— Defina uma classeManagerque estendeEmployee. 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étodogetDetails()que retorna"[name] manages [department]"acessando a propriedade protegida$namediretamente. Adicione também um métodogetDepartment()que retorna o departamento.main.php— Inclua ambos os arquivos de classe. Crie umManagercom o nome"Sarah", salário75000e departamento"Engineering". Imprima os detalhes do gerente usandogetDetails(). Em seguida, dê ao gerente um aumento de5000e imprima seu novo salário usandogetSalary(). 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 lugarprivate— acessível apenas dentro da classe que a defineprotected— 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
privatequando apenas a classe que a define deve acessar a propriedade - Use
protectedquando 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()
?>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
1Fundamentos de POO
Arquivos ExternosIntrodução à POOClasses vs ObjetosA Palavra-chave $thisMétodosPropriedadesConstrutor (__construct)Destrutor (__destruct)Recapitulação - Calculadora Simples4Herança
Herança BásicaA Palavra-chave parent::Sobrescrita de MétodoA Palavra-chave finalClasses AbstratasRecapitulação - Hierarquia de Funcionários7Encapsulamento
Público, Protegido, PrivadoModificadores de Acesso em DetalhesGetters e SettersOcultação de InformaçãoPromoção de Construtor (8.0)Recapitulação - Sistema de Registro de Alunos10Conceitos Avançados de POO
Composição vs HerançaInjeção de DependênciaClasses AnônimasEnums (PHP 8.1)Fibers (PHP 8.1)Mergulho Profundo em Clonagem de ObjetosGeradores e Iteradores13Padrões de Projeto Parte 2
Padrão CommandPadrão AdapterPadrão DecoratorPadrão Template MethodPadrão StatePadrão CompositePadrão Repository2Namespaces e Autoloading
Introdução a NamespacesA Palavra-chave usePadrão de Autoloading PSR-4Autoloader do ComposerRecapitulação - Projeto Organizado5Interfaces e Contratos
Introdução a InterfacesImplementando InterfacesImplementação de Múltiplas InterfacesInterface vs Classe AbstrataType Hinting com InterfacesRecapitulação - Calculadora de Formas8Métodos Mágicos
Introdução aos Métodos Mágicos__toString e __debugInfo__get, __set, __isset, __unset__call e __callStatic__clone e Clonagem de Objetos__serialize e __unserializeRecapitulação - Coleção Personalizada11Sistema de Tipos e Tratamento de Erros
Declarações de TiposTipos AnuláveisTipos de União e InterseçãoClasses de ExceçãoHierarquia de Exceções PersonalizadasTry, Catch, FinallyRecapitulação - Validador de Formulário14Projeto: Gerenciamento de Biblioteca
Visão Geral do ProjetoClasses Livro e Usuário3Propriedades de Classe
Propriedades de Instância vs EstáticasConstantes em ClassesMétodos e Propriedades EstáticosPropriedades Privadas e ProtegidasPropriedades Readonly (PHP 8.1)Recapitulação - Gerenciador de Conta Bancária6Polimorfismo
Sobrescrita de Métodos RevisitadaPolimorfismo via InterfacesType Hinting e Union TypesLate Static BindingRecapitulação - Processador de Pagamentos9Traits
Introdução a TraitsUsando Múltiplos TraitsResolução de Conflitos de TraitsMétodos Abstratos em TraitsTraits vs Herança12Padrões de Projeto Parte 1
Introdução aos Padrões de ProjetoPadrão SingletonPadrão FactoryPadrão ObserverPadrão Strategy