Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Dúvida no Ex. 1 da Aula 3 - Muitos Descontos e o Chain of Responsibility

<?php interface Desconto { public function desconto(Orcamento $Orcamento); public function setProximo(Desconto $Desconto); }

<?php class SemDesconto implements Desconto{ private $proximo; public function desconto(Orcamento $Orcamento){ return 0; } public function setProximo(Desconto $Desconto){ } }

<?php class Desconto500Reais implements Desconto{ private $proximo; public function desconto(Orcamento $Orcamento){ if($Orcamento->getValor() > 500) { return $Orcamento->getValor() * 0.07; } else { $this->proximo->desconto($Orcamento); } } public function setProximo(Desconto $Desconto){ $this->proximo = $Desconto; } }

<?php class Desconto5Itens implements Desconto{ private $proximo; public function desconto(Orcamento $Orcamento){ if (count($Orcamento->getItens()) >= 5) { return $Orcamento->getValor() * 0.10; } else { $this->proximo->desconto($Orcamento); } } public function setProximo(Desconto $Desconto){ $this->proximo = $Desconto; } }

<?php require_once 'Orcamento.php'; require_once 'Desconto.php'; require_once 'Desconto500Reais.php'; require_once 'Desconto5Itens.php'; require_once 'Imposto.php'; require_once "SemDesconto.php"; $reforma = new Orcamento(501); //Descontos

echo ""; echo "Descontos "; $Desconto5Itens = new Desconto5Itens(); $Desconto500Reais = new Desconto500Reais(); $SemDesconto = new SemDesconto();

$Desconto5Itens->setProximo($Desconto500Reais); $Desconto500Reais->setProximo($SemDesconto);

$desconto = $Desconto5Itens->desconto($reforma); echo $desconto; ?>

No código acima, todas as partes do código funcionam, porém na hora que a primeira função deve chamar a segunda e realizar o desconto por 7%, o retorno da segunda função Desconto não é armazenado na variável $desconto e se utilizar um:

echo $Orcamento->getValor() 0.07; return $Orcamento->getValor() 0.07;

Ele imprime normalmente o valor na tela, porém a variável $desconto ainda não assume valor algum, indicando que a primeira função segue o padrão Chain of responsability, porém o retorno da função não está sendo armazenado por qual razão?

1 resposta
solução!

Seu código tá difícil de ler assim, coloque ele entre ``` para facilitar a compreensão aqui, mas se eu entendi seu problema, vc esqueceu o *, dai não retorna o valor esperado, veja:

antes

echo   $Orcamento->getValor() 0.07;
return $Orcamento->getValor() 0.07;

depois

echo   $Orcamento->getValor() * 0.07;
return $Orcamento->getValor() * 0.07;