O Zen e a arte cavalheiresca da programação orientada a objeto (Parte 25)
Para ver os artigos anteriores desta série, clique aqui.
Respeitável público! Senhoras e Senhores! Rapazes e Raparigas de todo o Brasil! Com vocês, no palco do Circo Orientado a Objeto Ringling Bros. PHP, o fantástico mago transformador de objetos, o rei das interfaces spl, o grande Rasmussen! Vejam como ele transforma qualquer objeto em um array com apenas algumas linhas de código!
class CarrinhoDeCompras implements ArrayAccess, Countable {
// nosso carrinho de compras é, no fundo, um array de objetos da classe Item...
private $carrinho = array();
//coloca um Item no carrinho
//usando type hinting, veja o Item antes da variavel $item abaixo. Isso diz que essa função só aceita objetos da classe Item...
public function adicionaItem(Item $item){
$this->carrinho[] = $item;
}
//detona tudo no carrinho
public function esvaziaCarrinho(){
unset ($carrinho);
}
/*
Aqui entram as funções obrigatórias da interface ArrayAccess e Countable.
ArrayAccess: offsetExists, offsetGet, offsetSet, offsetUnset
Countable: count
Lembre-se: as interfaces exigem que voce use exatamente estes nomes para as funções!
*/
//Existe o item numero $indice? offsetExists responde:
public function offsetExists($indice) {
return isset($this->carrinho[$indice]);
}
//Me dá ai o ítem $indice:
public function offsetGet($indice){
return $this->carrinho[$indice];
}
//Muda o item numero $indice para esse item aqui ó
public function offsetSet($indice,$item) {
if ($indice){
$this->carrinho[$indice] = $item;
}
else {
throw new Exception('Precisamos do indice para inserir o item no lugar certo...');
}
}
// detona o item número $indice
public function offsetUnset($indice) {
unset($this->carrinho[$indice]);
}
// conta o numero de itens (obrigatório pela interface countable)
public function count(){
return count($this->carrinho);
}
}
class Item {
private $codigo;
private $descricao;
private $preco;
private $quantidade;
public function __construct($codigo,$descricao,$preco,$quantidade){
$this->codigo = $codigo;
$this->descricao = $descricao;
$this->preco = $preco;
$this->quantidade = $quantidade;
}
public function getCodigo(){
return $this->codigo;
}
public function getDescricao(){
return $this->descricao;
}
public function getPreco(){
return $this->preco;
}
public function getQuantidade(){
return $this->quantidade;
}
}
//Muito bem, agora vamos la!
$meucarrinho = new CarrinhoDeCompras();
$meucarrinho->adicionaItem(new Item('1','Caneta Bic Azul','1.00','10'));
$meucarrinho->adicionaItem(new Item('2','Caneta Bic Vermelha','1.50','5'));
$meucarrinho->adicionaItem(new Item('3','Caneta Bic Quatro Cores','3.50','15'));
//Agora, caros amigos, a mágica:
$total = 0;
for($i=0; $i<count($meucarrinho); $i++) { //<- $meucarrinho é um array? é um objeto? como???
print "Código: " . $meucarrinho[$i]->getCodigo() . " Descrição: " . $meucarrinho[$i]->getDescricao() ." Preço: " . $meucarrinho[$i]->getPreco() . " Quantidade: ". $meucarrinho[$i]->getQuantidade();
$total += $meucarrinho[$i]->getPreco() * $meucarrinho[$i]->getQuantidade();
}
print "O total da sua compra é: " . $total;
?>
Muito bom, não? Mas antes que vocês saiam por aí contando pra todo mundo que descobriram como se faz o truque, experimentem usar este objeto dentro de um foreach. Não rolou, certo? Você tem alguma idéia do porque? Muito bem, caro aprendiz! Você precisa implementar a interface Iterator, que falamos na semana passada, para que este objeto realmente se transforme em um Array completo!
Até semana que vem!
