PHP

Em por

No artigo de hoje, explicarei a relação entre classes em orientação a objetos, associação, agregação e composição. Quem está iniciando com os diagramas de classe da UML geralmente sente uma grande dificuldade em entender a diferença das formas de associação entre objetos de uma classe "Agregação" e de uma classe "Composição". Iremos aprender como funciona aplicando em OO com PHP.

Associação, agregação e composição em classes PHP

Para uma linguagem de programação qualquer ser orientado a objeto, ela tem que ser formada por classes, heranças, composições e agregações. A maioria delas hoje em dia, suporta esse paradigma de desenvolvimento.

Embora a ideia seja relativamente simples, nem sempre os novatos em programação conseguem assimilar com tanta facilidade estes conceitos, até porque são abstrações do mundo real.

Em OO é comum que objetos se relacionem um com os outros para desempenhar suas tarefas. Na programação OO, normalmente precisamos que objetos relacionem-se uns com os outros para que nosso objetivo maior seja atingido. Tal relação pode ser de associação, agregação ou composição.

  • Associação: É uma das relações mais comuns entre dois objetos, acontece quando um objeto "utiliza" outro, porém, sem que eles dependam um do outro. Em outras palavras, é como se eu tivesse duas classes distintas, e fizesse uso de uma delas dentro da outra, ou como parâmetro de outra.
  • Agregação: Acontece quando um objeto precisa de outro objeto para completar a sua ação (Todo/Parte), ou seja, faz a agregação de um objeto externo e o utiliza como parte de si própria. Um exemplo muito falado sobre esse tipo de relação é quanto ao carrinho de compras e seus produtos. A classe carrinho de compras (Todo) precisa da classe produtos (Parte) para executar suas ações.
  • Composição: Na composição, uma classe cria a instância de outra classe dentro de si própria, sendo assim, quando ela for destruída, a outra classe também será. Também é uma relação Todo/Parte, ou seja, a classe principal é o todo, e as outras classes nela instanciadas, suas partes.

Associação em PHP

Conforme descrito, é uma classe que faz a utilização de outra classe.

 <?php // Marido class Marido { // Propriedade public $nome; public $esposa; // Configura a propriedade function __construct( $nome = null, $esposa = null ) { $this->nome = $nome; $this->esposa = $esposa; } } // Esposa class Esposa { // Propriedade public $nome; // Configura a propriedade function __construct( $nome = null ) { $this->nome = $nome; } } // Faz as instâncias $esposa = new Esposa('Janaina'); $marido = new Marido('Leonardo', $esposa ); // Leonardo e Janaina echo $marido->nome . ' e ' . $marido->esposa->nome; ?>

O trecho de código acima não é muito útil, já que você poderia fazer tudo em uma classe só. Porém, demonstra bem a utilização de duas classes independentes trabalhando em conjunto para executar uma ação. A classe "Marido" utiliza a classe "Esposa" sem que nenhuma delas dependa uma da outra.

Agregação em PHP

Na agregação, uma classe precisa da outra para executar sua ação, ou seja, uma classe utiliza a outra como parte de si própria.

 <?php // Cria a classe que gera as propriedades do produto class Produtos { // Propriedades public $nome; public $valor; // Configura as propriedades function __construct ( $nome = null, $valor = null ) { $this->nome = $nome; $this->valor = $valor; } } // Cria o carrinho de compras class CarrinhoCompras { // Pega as propriedades do produto public $produtos; // Configura as propriedades do produto no array $this->produtos public function adiciona( Produtos $produto ) { $this->produtos[] = $produto; } // Exibe todos os produtos public function exibe() { foreach ( $this->produtos as $produto ) { echo $produto->nome . '<br>'; } } } // Cria duas instâncias da classe Produtos $produto1 = new Produtos('PlayStation'); $produto2 = new Produtos('Xbox'); // Cria uma instância da classe CarrinhoCompras $carrinho = new CarrinhoCompras(); // Adiciona os produtos ao carrinho $carrinho->adiciona( $produto1 ); $carrinho->adiciona( $produto2 ); // Exibe os dados na tela $carrinho->exibe(); ?>

No trecho acima, a classe "CarrinhoCompras" confia que a classe "Produtos" existe, ou seja, se ela for instanciada com qualquer parâmetro que não uma instância da classe "Produtos", você verá um erro na tela.

O diferencial aqui está no trecho:

 public function adiciona( Produtos $produto ) { $this->produtos[] = $produto; }

O trecho "Produtos $produto", garante que meu parâmetro deve (obrigatoriamente) ser uma instância da classe "Produtos". O melhor, sem a classe de produtos, a classe do carrinho de compras não funciona.

Composição em PHP

A diferença entre a composição e agregação, é que na composição, a classe principal (todo) cria uma instância da outra classe, que se torna parte dela. Quando a classe principal for destruída, sua instância da outra classe também será.

Veja um exemplo:

 <?php // Cria uma classe que configura o nome da pessoa class Pessoa { // Uma função que apenas adiciona "Nome: " no valor public function configura ( $nome ) { // Retorna return "Nome: " . $nome; } } // Cria uma classe para exibir dados class Exibe { // Configura as propriedades // $pessoa será a instância da classe Pessoa public $pessoa; // Este será apenas um nome public $nome; // Configura as propriedades function __construct( $nome = null ){ // Faz a instância da class Pessoa $this->pessoa = new Pessoa(); // Configura o valor do nome $this->nome = $nome; } public function exibe() { // Utiliza um método da classe Pessoa para exibir o nome enviado echo $this->pessoa->configura( $this->nome ); } } // Faz a instância da classe Exibe (todo) $exibe = new Exibe('Leonardo Martins'); // Retorna: 'Nome: Leonardo Martins ' $exibe->exibe(); ?>

Assim terminamos mais um artigo. Dúvidas, críticas ou sugestões comentem abaixo. laugh

Veja Também:

Artigos Relacionados a categoria: PHP

Olá, deixe seu comentário para Associação, agregação e composição em classes PHP

Enviando Comentário Fechar :/

...AINDA NÃO VIU NOSSO PORTFÓLIO?

Se ainda não viu nosso Portfólio e quer conhecer um pouco mais... aproveite e veja agora mesmo e tenha um site de qualidade para o seu negócio!

[contato]
Ver o Portfólio Agora