Getters e Setters
Parte da seção Programação Orientada a Objetos do Journey de PHP da Coddy — lição 40 de 91.
Agora que você entende os modificadores de acesso, como você interage com segurança com propriedades privadas de fora da classe? A resposta são os getters e setters — métodos públicos que fornecem acesso controlado a dados privados.
Um getter recupera o valor de uma propriedade, enquanto um setter o modifica. Este padrão permite adicionar validação ou lógica quando os dados são acessados ou alterados:
<?php
class User {
private string $email;
private int $age;
public function getEmail(): string {
return $this->email;
}
public function setEmail(string $email): void {
if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
$this->email = $email;
}
}
public function getAge(): int {
return $this->age;
}
public function setAge(int $age): void {
if ($age >= 0 && $age <= 150) {
$this->age = $age;
}
}
}
$user = new User();
$user->setEmail("john@example.com");
$user->setAge(25);
echo $user->getEmail() . "\n";
echo $user->getAge();
Saída:
john@example.com
25O setter valida o formato do e-mail e garante que a idade seja razoável antes de armazenar os valores. Sem setters, qualquer pessoa poderia atribuir dados inválidos diretamente. Você também pode criar propriedades de apenas leitura fornecendo apenas um getter, ou propriedades de apenas escrita com apenas um setter.
Ponto Chave: Getters e setters oferecem controle sobre como os dados privados são acessados e modificados, permitindo validação, formatação ou qualquer lógica personalizada.
Desafio
FácilVamos construir um sistema de inventário de produtos que utiliza getters e setters para proteger e validar os dados dos produtos. Você criará uma classe Product que garante que os preços sejam sempre positivos e as quantidades em estoque nunca sejam negativas — demonstrando como os setters podem aplicar regras de negócio.
Você organizará seu código em dois arquivos:
Product.php— Crie uma classeProductcom três propriedades privadas:$name(string),$price(float) e$stock(inteiro). Implemente getters e setters para cada propriedade com as seguintes regras de validação:setName()deve aceitar apenas strings não vazias — se a string estiver vazia após o trim, não atualize a propriedadesetPrice()deve aceitar apenas valores maiores que 0 — rejeite preços zero ou negativossetStock()deve aceitar apenas valores iguais ou maiores que 0 — rejeite quantidades de estoque negativas
getInfo()que retorna"[name]: $[price] ([stock] in stock)"com o preço formatado com 2 casas decimais.main.php— Inclua o arquivo Product. Você receberá quatro entradas: um nome de produto, um preço, uma quantidade em estoque e um novo preço para atualizar. Crie uma instância deProducte use os setters para atribuir o nome inicial, o preço (convertido para float) e o estoque (convertido para inteiro). Imprima o resultado degetInfo(). Em seguida, tente atualizar o preço com o novo valor de preço (convertido para float) e imprimagetInfo()novamente. Por fim, tente definir o estoque como-5(um valor inválido) e imprimagetInfo()mais uma vez para confirmar que o estoque não foi alterado.
Seus setters agem como guardiões — eles validam os dados recebidos antes de permitir alterações nas propriedades privadas. Quando dados inválidos são passados (como um estoque negativo), o setter simplesmente os ignora, mantendo intacto o valor válido existente. Este é o poder do encapsulamento: seu objeto mantém sua integridade, independentemente do que o código externo tente fazer.
Folha de consulta
Use getters e setters para fornecer acesso controlado a propriedades privadas. Um getter recupera um valor, enquanto um setter o modifica com validação opcional:
<?php
class User {
private string $email;
private int $age;
public function getEmail(): string {
return $this->email;
}
public function setEmail(string $email): void {
if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
$this->email = $email;
}
}
public function getAge(): int {
return $this->age;
}
public function setAge(int $age): void {
if ($age >= 0 && $age <= 150) {
$this->age = $age;
}
}
}
$user = new User();
$user->setEmail("john@example.com");
$user->setAge(25);
echo $user->getEmail(); // john@example.com
echo $user->getAge(); // 25
Setters podem validar dados antes de armazená-los. Se a validação falhar, o setter pode ignorar a atualização, mantendo o valor existente intacto. Você pode criar propriedades somente leitura fornecendo apenas um getter, ou propriedades somente escrita com apenas um setter.
Experimente você mesmo
<?php
require_once 'Product.php';
// Ler entradas
$name = trim(fgets(STDIN));
$price = trim(fgets(STDIN));
$stock = trim(fgets(STDIN));
$newPrice = trim(fgets(STDIN));
// TODO: Criar uma nova instância de Product
// TODO: Usar setters para atribuir o nome inicial, preço (como float) e estoque (como inteiro)
// TODO: Imprimir o resultado de getInfo()
// TODO: Atualizar o preço com newPrice (como float) e imprimir getInfo() novamente
// TODO: Tentar definir o estoque como -5 (inválido) e imprimir getInfo() para confirmar que o estoque não foi alterado
?>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