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.