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