Aprenda POO PHP

  • Página Inicial
  • Contato!
  • Tudo sobre POO PHP Parte 1!
  • Tudo sobre POO PHP Parte 2!
  • Tudo sobre POO PHP Parte 3!
  • Tudo sobre POO PHP Parte 4!
  • Tudo sobre POO PHP Parte 5!
  • Tudo sobre POO PHP Parte 6!
  • Tudo sobre POO PHP Parte 7!
  • Tudo sobre Poo PHP Parte 3

    Objetos Compostos em PHP

    Para fazermos um relacionamento entre classes, vamos supor o Objeto lutador, com esses atributos e métodos e suas visibilidades:

    Lutador
    - nome
    - nacionalidade
    - idade
    - altura
    - peso
    - categoria
    - vitórias
    - derrotas
    - empates
    + apresentar()
    + status()
    + ganharLuta()
    + perderLuta()
    + empatarLuta()

    Crie uma classe com o nome Lutador.php, com esse código:

    
    class Lutador {
        private $nome;
        private $nacionalidade;
        private $idade;
        private $altura;
        private $peso;
        private $categoria;
        private $vitorias;
        private $derrotas;
        private $empates;
        
        public function apresentar() {
            echo "<p>-------------------------------</p>";
            echo "<p>CHEGOU A HORA! O lutador " . $this->getNome();
            echo " veio diretamente de " . $this->getNacionalidade();
            echo ", tem " . $this->getIdade() . " anos e pesa " . $this->getPeso() . "Kg.";
            echo "<br/>Ele tem " . $this->getVitorias() . " vitórias, ";
            echo $this->getDerrotas() . " derrotas e " . $this->getEmpates() . " empates.</p>";
        }
        public function status() {
            echo "<p>-------------------------------</p>";
            echo "<p>" . $this->getNome() . " é um peso " . $this->getCategoria();
            echo " e já ganhou " . $this->getVitorias() . " vezes, ";
            echo " perdeu " . $this->getDerrotas() . " vezes e ";
            echo " empatou " . $this->getEmpates() . " vezes.</p>";
            
        }
        public function ganharLuta() {
            $this->setVitorias($this->getVitorias() + 1);
            // $this->vitorias = $this->vitorias + 1;
        }
        public function perderLuta() {
            $this->setDerrotas($this->getDerrotas() + 1);
        }
        public function empatarLuta() {
            $this->setEmpates($this->getEmpates() + 1);
        }
        
        public function __construct($no, $na, $id, $al, $pe, $vi, $de, $em) {
            $this->nome = $no;
            $this->nacionalidade = $na;
            $this->idade = $id;
            $this->altura = $al;
            $this->setPeso($pe);
            $this->vitorias = $vi;
            $this->derrotas = $de;
            $this->empates = $em;
        }
        public function getNome() {
            return $this->nome;
        }
    
        public function getNacionalidade() {
            return $this->nacionalidade;
        }
    
        public function getIdade() {
            return $this->idade;
        }
    
        public function getAltura() {
            return $this->altura;
        }
    
        public function getPeso() {
            return $this->peso;
        }
    
        public function getCategoria() {
            return $this->categoria;
        }
    
        public function getVitorias() {
            return $this->vitorias;
        }
    
        public function getDerrotas() {
            return $this->derrotas;
        }
    
        public function getEmpates() {
            return $this->empates;
        }
    
        public function setNome($nome) {
            $this->nome = $nome;
        }
    
        public function setNacionalidade($nacionalidade) {
            $this->nacionalidade = $nacionalidade;
        }
    
        public function setIdade($idade) {
            $this->idade = $idade;
        }
    
        public function setAltura($altura) {
            $this->altura = $altura;
        }
    
        public function setPeso($peso) {
            $this->peso = $peso;
            $this->setCategoria();
        }
    
        private function setCategoria() { // Esse não tem parâmetros
            if($this->peso <= 52.2) {
                $this->categoria = "Inválido";
            }
            else if($this->peso > 52.2 && $this->peso <= 70.3) {
                $this->categoria = "Leve";
            }
            else if($this->peso > 70.3 && $this->peso <= 83.9) {
                $this->categoria = "Médio";
            }
            else if($this->peso > 83.9 && $this->peso <= 120.2) {
                $this->categoria = "Pesado";
            }
            else {
                $this->categoria = "Inválido";
            }
        }
    
        public function setVitorias($vitorias) {
            $this->vitorias = $vitorias;
        }
    
        public function setDerrotas($derrotas) {
            $this->derrotas = $derrotas;
        }
    
        public function setEmpates($empates) {
            $this->empates = $empates;
        }
    }
    
    

    Lembrando que no método construtor, não terá o atributo "categoria", pois ela será calculada automaticamente pelo nosso programa.

    E no index, coloque isso:

    
    require_once "Lutador.php";
    
    $l = array(); // Uso de Array em PHP.
    
    $l[0] = new Lutador("Pretty Boy", "França", 30, 1.75, 68.9, 11, 2, 1); // Precisa passar os parâmetros referentes.
    $l[1] = new Lutador("Putscript", "Brasil", 29, 1.68, 57.8, 14, 2, 3);
    $l[2] = new Lutador("SnapShadow", "EUA", 35, 1.65, 80.9, 12, 2, 1);
    $l[3] = new Lutador("Dead Code", "Austrália", 28, 1.93, 81.6, 13, 0, 2);
    $l[4] = new Lutador("UFOCobol", "Brasil", 37, 1.70, 119.3, 5, 4, 3);
    $l[5] = new Lutador("Nerdaart", "EUA", 30, 1.81, 105.7, 12, 2, 4);
    
    $l[0]->perderLuta();
    $l[0]->apresentar();
    $l[0]->status();
    
    

    Nesse caso, um evento dispara outro evento e o segundo automaticamente configura um atributo. As variáveis foram colocadas em um array (que começa sempre com 0). A setCategoria() não pode ser chamada por ser privada.

    Teste outros "lutadores", e os outros métodos.

    Agregação entre Objetos em PHP

    Continuando a aula anterior, com os lutadores, usaremos a agregação entre as classes, que é a relação entre uma classe e outra. Veja o diagrama da classe Luta:

    Luta
    - desafiado
    - desafiante
    - rounds
    - aprovada
    + marcarLuta(l1, l2)
    + lutar()

    No caso, a classe Luta terá atributos e funções que farão a disputas entre eles.

    A classe Lutador não será alterada, e o index só deixe a criação dos objetos (lutadores), sem as invocações das funções.

    PS: Podemos criar várias classes dentro de um mesmo pacote (arquivo), mas não é recomendado. Dê a preferência de usar classes em arquivos separados pra facilitar o reuso.

    Esse é o código da classe Luta.php, que deverá ser criada:

    
    require_once "Lutador.php";
    
    class Luta {
        private $desafiado;
        private $desafiante;
        private $rounds;
        private $aprovada;
        
        public function marcarLuta($l1, $l2) {
            if($l1->getCategoria() === $l2->getCategoria() && $l1 != $l2) {
                $this->aprovada = true;
                $this->desafiado = $l1;
                $this->desafiante = $l2;
            }
            else {
                $this->aprovada = false;
                $this->desafiado = null;
                $this->desafiante = null;
            }
        }
        public function lutar() {
            if($this->aprovada) {
                echo "<### DESAFIADO ###>";
                $this->desafiado->apresentar();
                echo "<### DESAFIANTE ###>";
                $this->desafiante->apresentar();
                $vencedor = rand(0, 2);
                
                switch($vencedor) {
                    case 0:
                        // Empate
                        echo "<p>Empate!</p>";
                        $this->desafiado->empatarLuta();
                        $this->desafiante->empatarLuta();
                        break;
                    case 1:
                        // Desafiado Vence
                        echo "<p>" . $this->desafiado->getNome() . " vence!</p>";
                        $this->desafiado->ganharLuta();
                        $this->desafiante->perderLuta();
                        break;
                    case 2:
                        // Desafiante Vence
                        echo "<p>" . $this->desafiante->getNome() . " vence!</p>";
                        $this->desafiado->perderLuta();
                        $this->desafiante->ganharLuta();
                        break;
                    
                }
            }
            else {
                echo "<p>Luta não pode acontecer!</p>";
            }
        }
        
        public function getDesafiado() {
            return $this->desafiado;
        }
    
        public function getDesafiante() {
            return $this->desafiante;
        }
    
        public function getRounds() {
            return $this->rounds;
        }
    
        public function getAprovada() {
            return $this->aprovada;
        }
    
        public function setDesafiado($desafiado) {
            $this->desafiado = $desafiado;
        }
    
        public function setDesafiante($desafiante) {
            $this->desafiante = $desafiante;
        }
    
        public function setRounds($rounds) {
            $this->rounds = $rounds;
        }
    
        public function setAprovada($aprovada) {
            $this->aprovada = $aprovada;
        }
    }
    
    

    E no index, basta colocar isso:

    
    require_once "Luta.php"; // Não é necessário colocar também o Lutador.php
    
    $l = array();
    
    $l[0] = new Lutador("Pretty Boy", "França", 30, 1.75, 68.9, 11, 2, 1); // Precisa passar os parâmetros referentes
    $l[1] = new Lutador("Putscript", "Brasil", 29, 1.68, 57.8, 14, 2, 3);
    $l[2] = new Lutador("SnapShadow", "EUA", 35, 1.65, 80.9, 12, 2, 1);
    $l[3] = new Lutador("Dead Code", "Austrália", 28, 1.93, 81.6, 13, 0, 2);
    $l[4] = new Lutador("UFOCobol", "Brasil", 37, 1.70, 119.3, 5, 4, 3);
    $l[5] = new Lutador("Nerdaart", "EUA", 30, 1.81, 105.7, 12, 2, 4);
    
    $uec01 = new Luta();
    
    $uec01->marcarLuta($l[0], $l[1]);
    $uec01->lutar();
    
    $uec01->getDesafiado()->status();
    $uec01->getDesafiante()->status();
    
    

    Agora teste, mudando os números dos arrays para mudar as lutas, pra ver se podem ou não acontecer e etc.

    PS: Se houver uma agregação de objetos em classes, use o unset no objeto agregado dentro do destrutor (no caso o objeto Lutador seria destruído no destrutor da classe Luta).