Curso de PHP Orientado a Objetos – Parte 8

Slide1Oitavo artigo do curso de PHP Orientado a Objetos. Dessa vez, estudaremos o relacionamento entre objetos. Veremos na prática como se dá uma relação de associação, agregação e composição.

Vamos iniciar o oitavo artigo do curso de PHP Orientado a Objetos do site www.cafeesoftware.com.

Para conhecer as demais partes, clique aqui.
Ao final deste artigo, você será capaz de:
  • Entender como se da a relação entre objetos
  • Entender quando se dá um relacionamento de associação, agregação e composição 

Em OO é comum que objetos se relacionem um com os outros para desempenhar suas tarefas. Neste tutorial veremos os tipos de relacionamentos existentes.

 
Associação: É a relação mais comum entre dois objetos. Quando acontece? Quando uma classe “usa” outra classe.
Exemplo: Um motorista utiliza (depende do carro, mas este não faz parte do motorista) o carro para trabalhar. 
 
Agregação: É o tipo de relação conhecida como todo/parte. Na agregação o objeto agrega outro objeto, ou seja, torna um objeto externo parte de si.. Assim o objeto pai poderá utilizar funcionalidades do objeto agregado, mas ele não depende dele (agregado) para existir.
Exemplo: A tampa de uma caneta é parte da caneta, se a caneta não tiver a tampa, ela não deixará de ser uma caneta.
 
Composição: Neste caso, o objeto-pai é responsável pela criação e destruição de suas partes. O objeto-pai realmente “possui” as instâncias de suas partes. Resumidamente, um só existe caso o outro também exista.
Exemplo: O motor de um carro é parte fundamental do carro.
 
Agora que você já conhece na teoria os tipos de relacionamento, que tal vermos na prática?
 
Associação
 
A forma mais comum de associação é quando temos um objeto como atributo de outro. Criaremos um objeto Produto e outro Fornecedor. Onde Fornecedor é um dos atributos de Produto.
 
Vamos analisar o diagrama UML:
 
Associação entre Produto e Fornecedor
Observe que uma das propriedades (Fornecedor), espera receber um objeto do tipo Fornecedor.
 
Vamos agora criar as duas classes e em seguida os objetos.

 

Perceba que, ao criar o objeto Produto, passamos o objeto Fornecedor, em seguida, para imprimir fizemos uma referenciação de Produto e Fornecedor.

Agregação

Conforme visto anteriormente, esta relação se dá quando temos o “TODO/PARTE”. 
Uma forma de exemplificar sua implementação e com o clássico exemplo de um carrinho de compras. 
Teremos duas classes, produto (bem parecido com a que vimos anteriormente) e a classe Carrinho.
Observe o diagrama:

Relação de Agregação

Importante destacar que a propriedade Itens é um array, poderia ser representando como: Itens[] : Produto.
Observer que a classe Carrinho possui dois métodos, ExibeLista() e o CalculaTotal().
Vamos criar codificar as duas classes e em seguida criar os objetos:

Agora vamos criar a classe Carrinho: 


Vamos as explicações: Repare que na linha 5 da classe Carrinho estamos obrigando o $item a ser do tipo Produto. Este é um conceito conhecido como TypeHinting ou “Sugestão de tipo”, caso este método receba algo que não seja um Produto, ocasionará um erro.
Na linha 7 estamos inserindo cada produto no array $itens.
O método ExibeLista apenas percorre o array de itens exibindo o nome de cada produto.
O método CalculaTotal percorre o array de itens somando o valor de cada um e em seguida mostrando (formatado) o valor final.


Vamos testar?


 

Ao executar, você perceberá que a lista de itens (nome) será exibida, seguido do valor total.


Composição


A diferença da composição para a agregação é que quando o objeto “todo” é destruído, suas partes também são, exatamente por terem sido criadas pelo objeto “todo”. Podemos dizer que na composição o objeto-pai “possui” as instâncias de suas partes.
Observe a notação para a composição:

Relação de Composição

Neste exemplo, a classe cliente será responsável por instanciar contato. Vamos agora codificar para entender melhor:

Agora vamos criar a classe Cliente:



Perceba que a classe Cliente só existe se também existir a classe Contato. Uma aplicação clara da relação de composição. Vamos agora testar o exemplo:



Note que em nenhum momento instanciamos Contato, pois quem faz isso é a classe Cliente, daí a relação de composição.


Finalizamos assim mais um artigo do curso. 
Na próxima aula veremos os métodos __set(), __get() e __call() conhecidos como métodos interceptores. 
Utilize o espaço de comentários para críticas, sugestões ou elogios.


21 Responses to Curso de PHP Orientado a Objetos – Parte 8

  1. Julio Alves disse:

    Muito bom Tutorial, tá de Parabéns!
    ^^ ;DD

  2. Frank disse:

    Não acompanhei o curso, mas algumas aulas me tiraram algumas dúvidas, obrigado por compartilhar seus conhecimentos.

  3. Fabricio disse:

    Amigo Leandro, a sua série de artigos está excelente, estou aprendendo muito aqui, eu já estava tentando aprender orientação a objetos por conta própria faz um tempo, mas sem muito sucesso, aqui encontrei respostas claras e objetivas para várias questões que estavam meio nebulosas para mim, estou lendo todos os artigos desde o primeiro e com certamente irei até o fim. Parabéns pelo trabalho bem feito e como já dito por outros diversas vezes, obrigado por compartilhar seus conhecimentos.
    Valeu!!! ;D

  4. Breno Mol disse:

    Muito bom Leonardo, parabéns cara.

  5. Marcelo Augusto disse:

    Muito bom esse curso, de facil entendimento.

    testando o codigo aqui para pode entender melhor, os nomes não estavam imprimindo na tela.
    percebi que na function ExibeLista da classe Carrinho, onde esta $item->nome deve ser $item->Nome com “N” maiusculo, para pode imprimir os nomes.

    Otimo artigo, obrigado por compartilhar

  6. José Barbosa disse:

    Ótimo post, todos os posts muito bons. Um dúvida, os nomes das variáveis estão fora da convenção do php ou por convenção usa-se CamelCase em variáveis de instância… sou de outras linguagens e estou migrando para PHP então gostaria de saber a convenção que a comunidade usa.

  7. Henco disse:

    Não entendi 100% mas vlw mesmo cara!

  8. Zenon disse:

    É fundamental o compartilhamento de informação e conhecimento. Parabéns!

  9. Velotrol disse:

    Primeira mente parabéns pelo curso tenho aprendido muita coisa… Muito bom.
    obs:
    Ao implementar o exemplo de associação apresentou um erro na linha 38…
    echo “Código: ” . $produto->Codigo . “”;
    Notice: Undefined property: Produto::$Codigo in C:…associacao.php on line 38

    Trocar “$produto->Codigo” por “$produto->Id”;
    echo “Código: ” . $produto->Id. “”;

  10. Velotrol disse:

    Primeira mente parabéns pelo curso tenho aprendido muita coisa… Muito bom.
    obs:
    Ao implementar o exemplo de associação apresentou um erro na linha 38…
    echo “Código: ” . $produto->Codigo . “< br />";
    Notice: Undefined property: Produto::$Codigo in C:…associacao.php on line 38

    Trocar "$produto->Codigo" por "$produto->Id";
    echo "Código: " . $produto->Id. "< br />";

  11. Pedro Oliveira disse:

    Parabéns ! Estou aprendendo de forma muito útil o conteúdo…

  12. Moisés disse:

    Muito bom esse tutorial, Parabéns pelo trabalho!!!

  13. Robinson Oliveira disse:

    O gráfico que representa a associação entre Produto e Fornecedor está com a navegabilidade errada.

  14. Júlio disse:

    2/3 do curso concluído… dedos já doendo de tanto digitar códigos…

    Avante…

  15. Guilherme disse:

    Eu entendo associação como sendo uma relação um por um. Um objeto-pai tendo um objeto como sua propriedade. Agregação é uma relação um por n. Um objeto-pai tendo n objetos relacionados a uma de suas propriedades, que é um array de objetos. Composição também é uma relação um por um. A diferença é que o objeto é criado dentro da classe-pai. ou seja, o objeto-pai sendo destruído, o outro também será.

  16. PEDRO HENRIQUE disse:

    Leandro bom dia!

    Faço o curso de Sistemas para Internet e estou concluindo o 3º Semestre, é durante a Disciplina tive dois professores na Disciplina de “Análise e Projetos Orientado a Objetos” e nenhum deles conseguiu me passa com clareza o que foi descrito no Artigo. Muito obrigado, tenha uma boa semana.

  17. Rodrigo Baptista disse:

    Primeiramente Parabéns por todo o conteúdo até aqui; vem me ajudando bastante!
    Sobre o código da parte “Agregação” encontrei alguns erros quando fui reescrevê-lo para testar. O dividi em três arquivos diferentes e vou postá-los aqui para vocês:

    1º arquivo – classe Produto: Aula08.Agregacao.Produto.class.php

    Id = $Id;
    $this->Nome = $Nome;
    $this->Valor = $Valor;
    }
    }
    ?>

    2º arquivo – classe Carrinho: Aula08.Agregacao.Carrinho.class.php

    itens[] = $item;
    }
    public function ExibeLista(){
    foreach($this->itens as $itens){
    echo $itens->Nome.””;
    }
    }
    public function CalculaTotal(){
    $valorTotal = 0;
    foreach($this->itens as $itens){
    $valorTotal += $itens->Valor;
    }
    echo “R\$” . number_format($valorTotal, 2, ‘,’,’.’);
    }
    }
    ?>

    3º arquivo – testando o código: Aula08.Agregacao.index.php

    Untitled Document

    InsereProduto($produto01);
    $carrinhoCompra->InsereProduto($produto02);
    $carrinhoCompra->InsereProduto($produto03);

    $carrinhoCompra->ExibeLista();
    $carrinhoCompra->CalculaTotal();
    ?>

  18. Rodrigo Baptista disse:

    Ops galera, quando dei submit aqui, meu código bagunçou tudo e foi tudo errado e não consigo editá-lo, nem excluí-lo, portanto ignorem o código postado pois sumiram várias partes (Provavelmente por causa das tags)
    mas valeu aintenção rsrsrs.
    Vlw

  19. Leonardo Doneire disse:

    Cara muito obrigado por disponibilizar esse curso gratuito!Tem me ajudado bastante no aprendizado de PHPOO!!
    Que Deus te abençoe grandemente Obrigado!

  20. Mabraga disse:

    Parabéns pela sua iniciativa de boa vontade. Parabéns também pela didática ao se trabalhar um tema tão complexo para quem não conhece.

    Fique com Deus e que Ele o abençoe.

Deixe uma resposta para Henco Cancelar resposta

O seu endereço de email não será publicado Campos obrigatórios são marcados *