<?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?