
Introdução POO no PHP
Execute o seguinte código no PHP:
nome = $nome;
$this->preco = $preco;
$this->estoque = $estoque;
}
public function exibir() {
echo "Produto: {$this->nome}, Preço: R$ {$this->preco}, Estoque: {$this->estoque}" . "
";;
}
}
Atributos da Classe
- $nome: Armazena o nome do produto.
- $preco: Armazena o preço do produto.
- $estoque: Armazena a quantidade disponível em estoque.
Métodos da Classe
- __construct($nome, $preco, $estoque): Este é o método construtor da classe. Ele é chamado automaticamente quando uma nova instância de Produto é criada. Este método inicializa os atributos nome, preco, e estoque com os valores passados como argumentos.
- exibir(): Este método exibe as informações do produto: nome, preço e quantidade em estoque. Ele utiliza echo para imprimir uma string formatada com os valores desses atributos.
Exemplo de Utilização
nome = $nome;
$this->preco = $preco;
$this->estoque = $estoque;
}
public function exibir() {
echo "Produto: {$this->nome}, Preço: R$ {$this->preco}, Estoque: {$this->estoque}" . "
";;
}
}
// Exemplos de utilização da classe
$produto1 = new Produto("Notebook", 2500.00, 10);
$produto2 = new Produto("Mouse", 25.00, 50);
// Exibindo informações dos produtos
$produto1->exibir();
$produto2->exibir();
// Modificando os atributos diretamente
$produto1->preco = 2200.00;
$produto2->estoque = -5; // Isso é problemático!
// Exibindo informações atualizadas dos produtos
$produto1->exibir();
$produto2->exibir();
?>
Problemas Identificados
- Atributos Públicos:
- Os atributos $nome, $preco e $estoque são públicos, permitindo modificações diretas. Isso pode levar a inconsistências e valores inválidos, como estoque negativo.
- Validação Ausente:
- Não há validação para garantir que os valores dos atributos sejam válidos. Por exemplo, permitir que o estoque seja negativo não faz sentido para um sistema de controle de estoque.
- Gestão de Erros:
- O código não emite alertas ou erros quando valores inválidos são definidos, o que pode levar a problemas sem que o usuário perceba.
Sugestões de Melhoria
- Encapsulamento: Use métodos getters e setters para proteger os atributos e validar as alterações antes de aplicá-las.
- Validação Interna: Implemente lógica nos setters para assegurar que os valores sejam sempre válidos (ex.: estoque não pode ser negativo, preço deve ser maior que zero).
nome = $nome;
$this->setPreco($preco);
$this->setEstoque($estoque);
}
public function getNome() {
return $this->nome;
}
public function getPreco() {
return $this->preco;
}
public function setPreco($preco) {
if ($preco >= 0) {
$this->preco = $preco;
} else {
echo "Preço inválido!
";
}
}
public function getEstoque() {
return $this->estoque;
}
public function setEstoque($estoque) {
if ($estoque >= 0) {
$this->estoque = $estoque;
} else {
echo "Estoque inválido!
";
}
}
public function exibir() {
echo "Produto: {$this->nome}, Preço: R$ {$this->preco}, Estoque: {$this->estoque}
";
}
}
// Exemplos de utilização da classe
$produto1 = new Produto("Notebook", 2500.00, 10);
$produto2 = new Produto("Mouse", 25.00, 50);
// Exibindo informações dos produtos
$produto1->exibir();
$produto2->exibir();
// Tentando modificar atributos diretamente
$produto1->setPreco(2200.00);
$produto2->setEstoque(-5); // Isso será rejeitado com um aviso
// Exibindo informações atualizadas dos produtos
$produto1->exibir();
$produto2->exibir();
?>
Encapsulamento
- Definição: Encapsulamento é uma prática de programação que envolve restringir o acesso direto aos atributos de um objeto, permitindo interações somente através de métodos específicos (getters e setters). Isso protege os dados internos do objeto contra modificações inadequadas.
- Implementação: Os atributos $nome, $preco e $estoque foram definidos como private. Isso significa que eles só podem ser acessados ou modificados através dos métodos da classe, protegendo-os de acessos diretos externos.
Validação
Métodos Getters e Setters:
- Getters: Permitem acessar o valor de um atributo de forma controlada.
- Setters: Permitem modificar o valor de um atributo, mas incluem lógica para validar qualquer alteração.
Validação dos Valores:
Ao definir o preço (setPreco), verificamos se o valor é não-negativo antes de aplicá-lo.
Ao definir o estoque (setEstoque), garantimos que o valor não seja negativo. Se uma tentativa de definir um valor inválido ocorre, uma mensagem de erro é exibida.
Benefícios da Abordagem Melhorada
Proteção Contra Dados Inválidos:
Evita a introdução de valores inválidos, como preços negativos ou estoques negativos.
Controle Centralizado:
A lógica de como os atributos são alterados é centralizada nos métodos setters, facilitando a manutenção e evolução do código.
Confiabilidade e Segurança:
Reduz erros e inconsistências nos dados, aumentando a confiabilidade do sistema.
Flexibilidade:
Futuras alterações no comportamento de como os atributos são geridos podem ser facilmente implementadas apenas alterando os métodos de acesso.
Essas melhorias tornam o código mais robusto, seguro e fácil de manter, alinhando-o às melhores práticas de programação orientada a objetos.
Atividade: Criação de uma classe chamado veículo
Objetivo: Desenvolver habilidades de programação orientada a objetos em PHP através da implementação de uma classe com atributos e métodos, utilizando getters e setters.
Instruções
1. Criação da Classe:
- Implemente uma classe chamada Veiculo.
- A classe deve conter os atributos privados: marca, modelo, ano, e preco.
- Inclua um construtor que inicialize todos os atributos.
2.Implementação de Métodos:
- Crie métodos getters e setters para cada atributo, incluindo validações:
- setPreco($preco): O preço deve ser um valor positivo.
- setAno($ano): O ano deve ser um valor inteiro válido (maior que 1900).
3. Método Exibir:
- Adicione um método exibir() que imprima os detalhes do veículo no formato: “Veículo: {marca} {modelo}, Ano: {ano}, Preço: R$ {preco}”.
4. Testes Práticos:
- Instancie objetos da classe Veiculo com diferentes valores.
- Utilize os métodos setters para modificar os atributos com valores válidos e inválidos para testar as validações.
- Exiba os resultados antes e depois das modificações para validar o comportamento esperado.
Modifique e faça mais testes no código para reforçar o aprendizado!
Exercício de Reflexão
- Qual a importância de encapsular atributos em classes?
- Por que é importante incluir validações nos setters?