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.
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).