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 class causaria um erro. Isso protege o balance contra alterações sem passar pelo method deposit.
Uma propriedade protected funciona de maneira semelhante, mas também pode ser acessada por classes filhas que estendem a classe parent:
<?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 demonstre como proteger dados confidenciais usando propriedades private e protected.
Você criará três arquivos que trabalham juntos para gerenciar informações de funcionários com controle de acesso adequado:
Employee.php: Define umaEmployeeclass que serve como base para todos os funcionários. Ela deve ter uma propriedadeprotected $name(para que classes filhas possam acessá-la) e uma propriedadeprivate $salary(somente esta class deve modificar diretamente os salários). O constructor accepts um nome e um salário, definindo ambas as propriedades. Adicione um método públicogetName()que returns o nome, um método públicogetSalary()que returns o salário e um método públicogiveRaise($amount)que aumenta o salário pelo valor informado.Manager.php: Define umaManagerclass que extendsEmployee. Inclua o arquivo Employee no início. Adicione uma propriedade private$department. O constructor deve accepts nome, salário e departamento: call o constructor parent comparent::__construct($name, $salary)e, em seguida, defina o departamento. Crie um métodogetDetails()que returns"[name] manages [department]"acessando diretamente a propriedade protected$name. Adicione também um métodogetDepartment()que returns o departamento.main.php: Inclua os dois arquivos de class. Crie umManagercom o nome"Sarah", salário75000e departamento"Engineering". Print os detalhes do manager usandogetDetails(). Em seguida, dê ao manager um raise de5000e print o novo salário usandogetSalary(). Cada saída deve estar em sua própria linha.
Observe como a Manager class pode acessar diretamente a propriedade protected $name, mas deve usar o método getSalary() para acessar o salário private. Isso demonstra a diferença fundamental entre a visibilidade protected e private: protected permite o acesso da class filha, enquanto private 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 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 StrategyPratique por conta própria: Compilador de PHP online