PHP
Associação, agregação e composição em classes PHP
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.

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. =)
Gigasystems Login:
Informe seu e-mail abaixo para continuar!
XVeja Também:
Artigos Relacionados a categoria: PHP
Cotações para compra e venda de Moedas estrangeiras com PHP
27 julho de 2016
Gerenciador de dependências Composer
14 janeiro de 2016
Erro ao acessar um arquivo externo com o comando file_get_content
04 novembro de 2015
Baixando anexo do email no servidor com IMAP e PHP
27 agosto de 2015
Olá, deixe seu comentário para Associação, agregação e composição em classes PHP
Júlio César Araújo Silva