Olá amigos!
Implementei a classe DescontoPorVendaCasada, mas na hora do teste ela não funciona. Já tentei descobrir onde está o erro, mas ainda não consegui. Poderiam me ajudar?
Segue meu código:
class DescontoPorVendaCasada implements Desconto {
        private $proximoDesconto;
        public function desconto(Orcamento $orcamento) {
            if ($this->aconteceuVendaCasadaEm($orcamento)) {
                return $orcamento->getValor() * 0.05;
            } else {
                return $this->proximoDesconto->desconto($orcamento);
            }
        }
        private function aconteceuVendaCasadaEm(Orcamento $orcamento) {
            return $this->existe("caneta", $orcamento) && $this->existe("lapis", $orcamento);
        }
        private function existe($nomeDoItem, Orcamento $orcamento) {
            foreach ($orcamento->getItens() as $item) {
                if ($item->getNome() == $nomeDoItem) {
                    return true;
                }
                return false;
            }
        }
        public function setProximo(Desconto $desconto) {
            $this->proximoDesconto = $desconto;
        }
    }
require_once "Desconto.php";
    require_once "Desconto500Reais.php";
    require_once "Desconto5Itens.php";
    require_once "DescontoPorVendaCasada.php";
    require_once "SemDesconto.php";
    class CalculadorDeDescontos {
        public function calcula(Orcamento $orcamento) {
            $d1 = new Desconto5Itens();
            $d2 = new Desconto500Reais();
            $d3 = new DescontoPorVendaCasada();
            $dfim = new SemDesconto();
            $d1->setProximo($d2);
            $d2->setProximo($d3);
            $d3->setProximo($dfim);
            $valorDoDesconto = $d1->desconto($orcamento);
            return $valorDoDesconto;
        }
    }
require_once "Orcamento.php";
    require_once "Item.php";
    require_once "CalculadorDeDescontos.php";
    $orcamento = new Orcamento(300);
    $item1 = new Item('sapato', 100);
    $item2 = new Item('bone', 50);
    $item3 = new Item('bermuda', 50);
    $item4 = new Item('caneta', 50);
    $item5 = new Item('lapis', 50);
    //$item6 = new Item('caderno', 10);
    $orcamento->addItem($item1);
    $orcamento->addItem($item2);
    $orcamento->addItem($item3);
    $orcamento->addItem($item4);
    $orcamento->addItem($item5);
    //$orcamento->addItem($item6);
    $calculadora = new CalculadorDeDescontos();
    echo "Valor: " . $orcamento->getValor() . "<br />";
    echo "Desconto: R$ " . $calculadora->calcula($orcamento);
interface Desconto {
        public function desconto(Orcamento $orcamento);
        public function setProximo(Desconto $desconto);
    }
class Orcamento {
    private $valor;
    private $itens;
    function __construct($novoValor) {
      $this->valor = $novoValor;
      $this->itens = array();
    }
    public function getValor() {
      return $this->valor;
    }
    public function getItens() {
        return $this->itens;
    }
    public function addItem(Item $item) {
        $this->itens[] = $item;
    }
  }
class Item {
        private $nome;
        private $valor;
        public function __construct($nome, $valor) {
            $this->nome = $nome;
            $this->valor = $valor;
        }
        public function getNome() {
            return $this->nome;
        }
        public function getValor() {
            return $this->valor;
        }
    }