Na segunda parte do exercício, faremos a ligação das classes Video e Gafanhotos, usando uma classe com o nome Visualizacao. Esse é o diagrama dela:
Visualizacao |
---|
- espectador - filme |
+ avaliar() + avaliar(nota) + avaliar(porc) |
PS: Lembrando que no PHP não existe sobrecarga, vamos usar uma "gambiarra" pra burlar isso.
Veja o código de Visualizacao:
require_once "Video.php";
require_once "Gafanhoto.php";
class Visualizacao {
private $espectador;
private $filme;
public function __construct($espectador, $filme) {
$this->espectador = $espectador;
$this->filme = $filme;
$this->filme->setViews($this->filme->getViews() + 1);
$this->espectador->setTotAssistido($this->espectador->getTotAssistido() + 1);
}
public function __destruct() {
unset($this->espectador);
unset($this->filme);
echo "Objeto Visualizacao Destruído!<br/>";
}
public function getEspectador() {
return $this->espectador;
}
public function getFilme() {
return $this->filme;
}
public function setEspectador($espectador) {
$this->espectador = $espectador;
}
public function setFilme($filme) {
$this->filme = $filme;
}
}
E no index, podemos fazer isso:
require_once "Visualizacao.php";
$v = array();
array_push($v, new Video("Aula 1 de POO"));
array_push($v, new Video("Aula 12 de PHP"));
array_push($v, new Video("Aula 15 de HTML5"));
$g = array();
array_push($g, new Gafanhoto("Jubileu", 22, "M", "Jubi"));
array_push($g, new Gafanhoto("Creuza", 12, "F", "Creuzita"));
$vis = array();
array_push($vis, new Visualizacao($g[0], $v[2]));
array_push($vis, new Visualizacao($g[0], $v[1]));
print_r($vis[0]);
print_r($vis[1]);
unset($v);
unset($g);
unset($vis);
Agora faremos o polimorfismo de sobrecarga (que na prática, não existem em PHP). Terá três tipos de avaliação, por like, por nota e por porcentagem de vídeos assistidos.
Abaixo do método construtor em Visualização, apenas poste isso:
public function avaliar() {
$this->filme->setAvaliacao(5);
}
public function avaliarNota($nota) {
$this->filme->setAvaliacao($nota);
}
public function avaliarPorc($porc) {
$nova = 0;
if($porc <= 20) {
$nova = 3;
}
else if($porc > 20 && $porc <= 50) {
$nova = 5;
}
else if($porc > 50 && $porc <= 90) {
$nova = 8;
}
else {
$nova = 10;
}
$this->filme->setAvaliacao($nova);
}
Mas tem um porém, várias pessoas podem ver o vídeo, e dessa forma ele fará que a última avaliação que prevaleça. Para resolver isso, criaremos uma forma dele criar uma média de avaliações.
Na classe Video, em public function setAvaliacao, modificaremos pra isso:
public function setAvaliacao($avaliacao) {
$media = ($this->avaliacao + $avaliacao) / $this->views;
$this->avaliacao = $media;
}
Como podemos ver, podemos personalisar os métodos getter e setter, nem sempre precisamos "aceitar" tudo que o Netbeans nos sugere.
E no index, para exibir, faremos isso:
require_once "Visualizacao.php";
$v = array();
array_push($v, new Video("Aula 1 de POO"));
array_push($v, new Video("Aula 12 de PHP"));
array_push($v, new Video("Aula 15 de HTML5"));
$g = array();
array_push($g, new Gafanhoto("Jubileu", 22, "M", "Jubi"));
array_push($g, new Gafanhoto("Creuza", 12, "F", "Creuzita"));
$vis = array();
array_push($vis, new Visualizacao($g[0], $v[2]));
array_push($vis, new Visualizacao($g[0], $v[1]));
$vis[0]->avaliar();
$vis[1]->avaliarPorc(85.0);
print_r($vis[0]);
print_r($vis[1]);
unset($v);
unset($g);
unset($vis);
PS: Também utilizamos objetos para ligar o PHP com banco de dados, como por exemplo, o uso de PDO.