LAB-8

Introdução POO no PHP

Execute o seguinte código no PHP:

				
					<?php

class Produto {
    public $nome;
    public $preco;
    public $estoque;

    public function __construct($nome, $preco, $estoque) {
        $this->nome = $nome;
        $this->preco = $preco;
        $this->estoque = $estoque;
    }

    public function exibir() {
        echo "Produto: {$this->nome}, Preço: R$ {$this->preco}, Estoque: {$this->estoque}" . "<br>";;
    }
}
				
			

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

				
					<?php

class Produto {
    public $nome;
    public $preco;
    public $estoque;

    public function __construct($nome, $preco, $estoque) {
        $this->nome = $nome;
        $this->preco = $preco;
        $this->estoque = $estoque;
    }

    public function exibir() {
        echo "Produto: {$this->nome}, Preço: R$ {$this->preco}, Estoque: {$this->estoque}" . "<br>";;
    }
}

// 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).
				
					<?php

class Produto {
    private $nome;
    private $preco;
    private $estoque;

    public function __construct($nome, $preco, $estoque) {
        $this->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!<br>";
        }
    }
    
    public function getEstoque() {
        return $this->estoque;
    }
    
    public function setEstoque($estoque) {
        if ($estoque >= 0) {
            $this->estoque = $estoque;
        } else {
            echo "Estoque inválido!<br>";
        }
    }

    public function exibir() {
        echo "Produto: {$this->nome}, Preço: R$ {$this->preco}, Estoque: {$this->estoque}<br>";
    }
}

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