Menu
Coddy logo textTech

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 interagir 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 aos dados privados.

Um getter recupera o valor de uma propriedade, enquanto um setter o modifica. Esse 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
25

O 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 somente leitura fornecendo apenas um getter ou propriedades somente gravação com apenas um setter.

Ponto principal: Getters e setters dão a você controle sobre como os dados privados são acessados e modificados, permitindo validação, formatação ou qualquer lógica personalizada.

challenge icon

Desafio

Fácil

Vamos criar um sistema de inventário de produtos que usa 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 que as quantidades em estoque nunca sejam negativas: demonstrando como os setters podem impor regras de negócio.

Você organizará seu código em dois arquivos:

  • Product.php: crie uma classe Product com três propriedades privadas: $name (string), $price (float) e $stock (integer). 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 a remoção dos espaços em branco, não atualize a propriedade
    • setPrice() deve aceitar apenas valores maiores que 0: rejeite preços iguais a zero ou negativos
    • setStock() deve aceitar apenas valores iguais ou maiores que 0: rejeite quantidades de estoque negativas
    Cada getter deve simplesmente retornar o valor da propriedade correspondente. Adicione um método público getInfo() que retorne "[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 de Product e use os setters para atribuir o nome inicial, o preço (convertido para float) e o estoque (convertido para integer). Imprima o resultado de getInfo(). Em seguida, tente atualizar o preço com o novo valor de preço (convertido para float) e imprima getInfo() novamente. Por fim, tente definir o estoque como -5 (um valor inválido) e imprima getInfo() mais uma vez para confirmar que o estoque não foi alterado.

Seus setters atuam 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. Esse é o poder do encapsulamento: seu objeto mantém sua integridade independentemente do que o código externo tente fazer.

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: Crie uma nova instância de Product

// TODO: Use os setters para atribuir o name inicial, price (como float) e stock (como integer)

// TODO: Imprima o resultado de getInfo()

// TODO: Atualize o price com newPrice (como float) e imprima getInfo() novamente

// TODO: Tente definir stock como -5 (inválido) e imprima getInfo() para confirmar que o stock não foi alterado

?>
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

Pratique por conta própria: Compilador de PHP online