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

Nenhum produto encontrado nessa seleção.

Na programação orientada a objetos, 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.

Vamos ver como isso funciona na prática.

Associação em PHP

Conforme descrito, é uma classe que faz a utilização de outra classe. Veja o trecho de código abaixo:

<?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('Maria');
$marido = new Marido('Joãozinho', $esposa );

// Joãozinho e Maria
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('Luiz Otávio');

// Retorna: 'Nome: Luiz Otávio'
$exibe->exibe();
?>

Simples assim!

Concluindo

Não deixe de seguir as outras aulas do nosso curso de PHP gratuito e PHP Orientado a Objetos.