Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Job Lopes

Dúvida em Agregação entre classes

Recommended Posts

Saudações aos companheiros do fórum Imaster.

Como sou novo no PHP, comecei os estudos de PHP orientado a Objetos e tive algumas dúvidas em um pequeno código sobre agregação entre classes.

Gostaria contar com a ajuda dos senhores. O código é o seguinte:

<?php
header('Content-Type: text/html; charset=utf-8');

class Produtos {

    public $nome;
    public $valor;

    function __construct($nome = null, $valor = null) {
        $this->nome = $nome;
        $this->valor = $valor;
    }
}

class CarrinhoCompras {

    //pega as propriedades do produto
    public $produto;

    //configura as propriedades do produto no Array $this->produtos
    public function adiciona(Produtos $produto) {
        $this->produto[] = $produto;
    }

//exibe todos os produtos
    public function exibe() {
        foreach ($this->produto as $produto) {
            echo $produto->nome . "<br/>";
        }
    }
}

//crie 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();

Pois bem, a minha dúvida surgiu na classe CarrinhoCompras.

 

class CarrinhoCompras {

//pega as propriedades do produto
public $produto;

 

//configura as propriedades do produto no Array $this->produtos
public function adiciona(Produtos $produto) {
$this->produto[ ] = $produto;

 

}

Eu não entendi bem a lógica por trás da relação entre o array e o atributo $produto da classe Produtos.

Posso pensar que o atributo $produto servirá para guardar os dados provenientes da classe Produtos ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como em um carrinho de compras do supermercado, você pode adicionar e/ou remover produtos do carrinho.

 

O método 'adiciona' adicionará um produto ao carrinho. O array produto, guardará o objeto produto, no carrinho.

 

É como você pensar no carrinho do supermercado (ou na cesta), você pega um produto da prateleira e adiciona ao carrinho. Nesse momento, o produto é parte do carrinho/cesta e não mais da prateleira/mostruário.

 

Já, para a parte de associação (simples, agregação e composição) é uma questão analisar as "consequências" da associação. Como tanto o produto quanto o carrinho podem existir de forma independente, mas, o produto não poderá estar associado a prateleira e ao carrinho ao mesmo tempo, caracteriza-se uma associação de agregação.

 

Em hipóteses, você poderia pensar da seguinte maneira:

 

Caso o produto estivesse pudesse estar associado a ambos ao mesmo tempo, seria associação simples. Caso tanto o carrinho como o produto não pudesse existir de forma independente, seria composição.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Valeu amigo moderador, agora entendi melhor. Sua explicação me ajudou muito, principalmente porque me levou a analisar o código como representação de um problema real. Ao pensar num carrinho de supermercado, eu pude interpretar melhor a função do método adiciona. Assim como você postou: "O método 'adiciona' adicionará um produto ao carrinho. O array produto, guardará o objeto produto, no carrinho".

 

Mas ainda ficou uma pequena dúvida no entendimento do trecho de código abaixo:

class CarrinhoCompras {

    //pega as propriedades do produto
    public $produto;

    //configura as propriedades do produto no Array $this->produtos
    public function adiciona(Produtos $produto) {
        $this->produto[] = $produto;
    }

Aqui eu estou confundindo o atributo $produto da classe com a variável local da função adiciona, que é do tipo de classe - Produto. Mas e a linha final da função ($this->produto[] = $produto), aqui se está transformando o atributo $produto da classe diretamente em um array e o armazenando na variável local $produto da função?

Sem querer abusar da vontade, pediria mais uma ajuda para entender essa parte.

 

Grato Job

Compartilhar este post


Link para o post
Compartilhar em outros sites

[...]Mas e a linha final da função ($this->produto[] = $produto), aqui se está transformando o atributo $produto da classe diretamente em um array[...]

Sim, de certa forma.

 

A propriedade $produto foi definida sem nenhum valor, como pode ser visto aqui:

//pega as propriedades do produto
public $produto;
Propriedades não estáticas, somente podem ser referenciadas com $this, ou seja:

$this->produto;

A variável $produto, dentro do método adiciona carrinho, tem escopo local no método. Ela veio como parâmetro na chamada do método. Isso diferencia a propriedade $produto (que conterá uma lista de produtos) do parâmetro $produto (que é o produto em si).

 

Quando você adiciona os colchetes para a atribuição (antes do igual), significa que você quer adicionar um elemento no final de um array existente, ou seja, sem perder os valores anteriores.

$this->produto[] = $produto;
O PHP entende que a variável é um array (ou ao menos deveria ser um). Caso a variável não seja um array, mas é de um tipo scalar (integer, float, string ou boolean), ele realiza o cast type automática para array. Vantagem de ser uma linguagem dinâmica.

 

Os colchetes em branco, na frente, se torna igual a isso:

array_push($this->produto , $produto);

[...]e o armazenando na variável local $produto da função?

Essa afirmação ficou um pouco confusa. A variável local do método 'adiciona' (funções em classes/objetos são métodos), que é $produto, é o produto em si (aquele que está sendo adicionado ao carrinho). A variável $produto é um parâmetro, ou seja, o seu valor/atributo foi atribuído fora do escopo do método.

 

A propriedade (variáveis de classes/objetos são propriedades) é a lista de produtos, ou seja, o array.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Irmão, muito obrigado, agora confesso que fechou meu entendimento- eu estava "agarrando" em alguns conceitos fundamentais, como conversão de tipos automática, trabalhos com arrays, etc. Assim eu voltei a estes tópicos e dei uma estudada legal para aprender e fixar bem. Agora me sinto mais seguro p/ continuar estudando e pondo em prática esses e outros conceitos de orientação a objetos em PHP.

Parabenizo-o pelo conhecimento, boa didática e dedicação em ajudar aos que buscam por ajuda com a linguagem.

 

Grato Job

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por rtfacincani
      Prezados, necessito gerar uma consulta ao banco de dados Oracle e estou enfrentando dificuldades em retornar valores. Abaixo vou explicar como as tabelas estão montadas
       
      Tab1:NotaFiscal
      codnota,datanota,codveiculo,datasaida,datachegada
       
      Tab2:Combustivel
      codveiculo,dataabastecimento,kmpercorrido,qtdlitros,medialistros
       
      O que preciso? Preciso saber dentro do período da NotaFiscal, qual o veículo que entre a datasaida e datachegada, foram abastecidos, e qual o total de kilometros percorridos entre as datas de saida e chegada da notafiscal.
       
      A saída ficaria assim:
       
      codnota,datanota,codveiculo,totalkmpercorrido,totalqtdlitros,medialitros.
       
      Tentei algo assim, mas não deu certo estou tendo esta dificuldade:
       
      select n.codnota,n.datanota,n.codveiculo,sum(c.totalkmpercorrido) as totalkmpercorrido,sum(c.totalqtdlitros) as totalqtdlitros,avg(c.medialitros) as medialitros from notafiscal n inner join combustivel c on n.codveiculo = c.codveiculo
      where c.dataabastecimento between n.datasaida and n.datachegada
      group by codnota,datanota,codveiculo
       
      Porém não estou conseguindo retornar os valores, principalmente por não ter em combustível o motivo para o abastecimento, visto que pode ser que seja uma viagem e entre a datasaida e datachegada pode existir vários abastecimentos e a única coisa que tenho para ligar é o código do veículo e as datas de saída e chegada emitida pela nota.
       
      Será que alguém poderia me auxiliar com essa consulta?
       
       
       
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.