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 contra alterações sem passar pelo método deposit.
Uma propriedade protected funciona de maneira 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 principal: Use private quando somente a classe que o define deve acessar a propriedade. Use protected quando as classes filhas também precisarem de acesso. Ambos impedem o acesso externo direto, mantendo o estado interno do seu objeto seguro.
Desafio
FácilVamos criar um sistema seguro de gerenciamento de funcionários que demonstra como proteger dados confidenciais 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 servirá 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(somente esta classe deve modificar os 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 informado.Manager.php: Defina uma classeManagerque estendeEmployee. Inclua o arquivo Employee no início. Adicione uma propriedade privada$department. O construtor deve aceitar nome, salário e departamento: chame o construtor da classe pai comparent::__construct($name, $salary)e, em seguida, defina o departamento. Crie um métodogetDetails()que retorna"[name] manages [department]"acessando diretamente a propriedade protegida$name. Adicione também um métodogetDepartment()que retorna o departamento.main.php: Inclua os dois arquivos de classe. Crie umManagercom o nome"Sarah", salário75000e departamento"Engineering". Imprima os detalhes do gerente usandogetDetails(). Em seguida, dê um aumento de5000ao gerente e imprima seu novo salário usandogetSalary(). Cada saída deve estar em sua própria linha.
Observe como a classe Manager pode acessar diretamente a propriedade protegida $name, mas deve usar o método getSalary() para acessar o salário privado. Isso demonstra a principal diferença entre visibilidade protegida e privada: a protegida permite o acesso da classe filha, enquanto a privada mantém os dados realmente ocultos.
Experimente você mesmo
<?php
require_once 'Employee.php';
require_once 'Manager.php';
// TODO: Crie um Manager com nome "Sarah", salário 75000 e departamento "Engineering"
// TODO: Imprima os detalhes do manager usando getDetails()
// TODO: Dê ao manager um aumento de 5000
// TODO: Imprima 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 OOP
Arquivos externosIntrodução à OOPClasses vs. objetosA palavra-chave $thisMétodosPropriedadesConstrutor (__construct)Destrutor (__destruct)Recapitulação - Calculadora simples4Herança
Herança BásicaA Palavra-chave parent::Sobrescrita de MétodosA Palavra-chave finalClasses AbstratasRecapitulação - Hierarquia de Funcionários7Encapsulamento
Público, Protegido, PrivadoModificadores de Acesso em ProfundidadeGetters e SettersOcultação de InformaçõesPromoção de Construtor (8.0)Recapitulação - Sistema de Registros de Alunos10Conceitos Avançados de OOP
Composição vs. HerançaInjeção de DependênciaClasses AnônimasEnums (PHP 8.1)Fibras (PHP 8.1)Análise Profunda da 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 às InterfacesImplementando InterfacesImplementação de Múltiplas InterfacesInterface vs Classe AbstrataTipagem 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 NulosTipos de União e InterseçãoClasses de ExceçãoHierarquia de Exceções PersonalizadaTry, Catch, FinallyRecapitulação - Validador de Formulário14Projeto: Gerenciamento de Biblioteca
Visão Geral do ProjetoClasses de Livros e Usuários3Propriedades de Classes
Propriedades de Instância vs. EstáticasConstantes em ClassesMétodos e Propriedades EstáticosPropriedades Privadas e ProtegidasPropriedades Somente para Leitura (PHP 8.1)Recapitulação - Gerenciador de Contas Bancárias6Polimorfismo
Revisão da Sobrescrita de MétodosPolimorfismo via InterfacesIndicação de Tipos e Tipos UnionVinculação Estática TardiaRecapitulação - Processador de Pagamentos9Traits
Introdução a TraitsUsando Múltiplos TraitsResolução de Conflitos entre 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 StrategyPratique por conta própria: Compilador de PHP online