Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Erro ao chamar função 'AconteceuVendaCasadaEm'

Olá!

Fiz o meu código seguindo a videoaula e testei também com o código fornecido no exercício. Das duas formas continuo recebendo o mesmo erro:

Fatal error: Call to undefined function temVendaCasada() in C:\wamp64\www\design-patterns\DescontoPorVendaCasada.php on line 38

Segue o código da minha classe DescontoPorVendaCasada

<?php

//    P1 ...
    class DescontoPorVendaCasada implements IDesconto {

    //    P2.1 ...
        private $proximo_desconto;

    //    P5 ...
        private function existe($f_nome_item, Orcamento $f_orcamento) {

            foreach ($f_orcamento->getItens() as $f_item) {

                if ($f_item->getNome() == $f_nome_item) {

                    return true;

                } else {

                    return false;

                }

            }

        }

    //    P4 ...
        private function temVendaCasada(Orcamento $f_orcamento) {

            return $this->existe("Tijolo", $f_orcamento) && $this->existe("Cimento", $f_orcamento);

        }

    //    P3 ...
        public function desconta(Orcamento $f_orcamento) {

            if (temVendaCasada($f_orcamento)) {

                return $f_orcamento->getValor() * 0.05;

            } else {

                return $this->proximo_desconto->desconta($f_orcamento);

            }

        }

    //    P2.2 ...
        public function setProximo(IDesconto $f_proximo) {

            $this->proximo_desconto = $f_proximo;

        }


/*    #     Código fornecido no exercício
        public function desconta(Orcamento $orcamento) {
            if(aconteceuVendaCasadaEm($orcamento)) return $orcamento->getValor() * 0.05;
            else return $this->proximo->calcula($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(IDesconto $proximo) {
            $this->proximo = $proximo;
        } */


    }

Não estou conseguindo identificar aonde está o erro. Por gentileza, alguém poderia me ajudar?

2 respostas
solução!

Oi Breno, tudo bom?

Acredito que esteja faltando a chamda da referencia com o $this aqui:

            if (temVendaCasada($f_orcamento)) {

O ideal seria:

            if ($this->temVendaCasada($f_orcamento)) {

Abraço

Oi, André!

Tentei dessa forma também. Neste caso o erro some, mas não estava entrando na condição.

O erro foi meu. Estava no fato de eu ter colocado o 'return false' dentro do 'foreach'.

O correto é:

private function existe($f_nome_item, Orcamento $f_orcamento) {

            foreach ($f_orcamento->getItens() as $f_item) {

                if ($f_item->getNome() == $f_nome_item) {

                    return true;

                } 

            }

            return false;

        }

Agradeço pela atenção!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software