1
resposta

Erro na chamada da função

Boa noite! Tudo bem?

Por que ao deixar meu código no estilo como está o do exercício visualizei este erro?

Fatal error: Uncaught Error: Call to a member function comCnpj() on null in C:\xampp\htdocs\curso-designpatterns\gerarNF.php:16 Stack trace: #0 {main} thrown in C:\xampp\htdocs\curso-designpatterns\gerarNF.php on line 16

<?php
    date_default_timezone_set("Brazil/East");

    function autoload($class) {
        require $class.".php";
    }

    spl_autoload_register("autoload");

    $gerador = new NotaFiscalBuilder();
    $gerador->addAcao(new Impressora());
    $gerador->addAcao(new NotaFiscalDao());
    $gerador->addAcao(new Multiplicador(6));

    $nf = $gerador->comEmpresa('MilKu')
                    ->comCnpj('123.456.789/0001-10')
                    ->addItem(new Item('iPhone', 3500))
                    ->addItem(new Item('Galaxy S9', 3500))
                    ->addItem(new Item('Carregador', 100))
                    ->addItem(new Item('Case', 50))
                    ->comObservacoes('Comprei tudinho')
                    ->build();

    echo "<pre>";
    var_dump($nf);
?>
<?php
    class NotaFiscalBuilder {
        private $empresa;
        private $cnpj;
        private $itens;
        private $valorBruto;
        private $valorImpostos;
        private $observacoes;
        private $dtEmissao;

        private $acoesAoGerar;

        function __construct(){
            $this->valorBruto = 0;
            $this->valorImposto = 0;
            $this->dtEmissao = date('Y-m-d H:i:s');
            $this->itens = array();
            $this->acoesAoGerar = array();
        }

        public function addAcao(AcoesAoGerarNF $acao){
            $this->acoesAoGerar[] = $acao;
        }

        public function comEmpresa($empresa){
            $this->empresa = $empresa;
        }

        public function comCnpj($cnpj){
            $this->cnpj = $cnpj;
        }

        public function addItem(Item $item){
            $this->itens[] = $item;
            $this->valorBruto += $item->getValor();
            $this->valorImpostos += ($item->getValor() * 0.2);
        }

        public function comObservacoes($obs){
            $this->observacoes = $obs;
        }

        public function naData($data){
            $this->dtEmissao = $data;
        }

        public function build(){
            $nf = new NotaFiscal($this->empresa, $this->cnpj, $this->itens, $this->valorBruto, $this->valorImpostos, $this->observacoes, $this->dtEmissao);

            //antes do retorno
            foreach($this->acoesAoGerar as $acao){
                $acao->executa($nf);
            }

            return $nf;
        }




    }
?>

Muito obrigado!

1 resposta

Oi Matheus, tudo bom?

para ter a chamada do builder nesse modelo:

 $nf = $gerador->comEmpresa('MilKu')
                    ->comCnpj('123.456.789/0001-10')
                    ->addItem(new Item('iPhone', 3500))
                    ->addItem(new Item('Galaxy S9', 3500))
                    ->addItem(new Item('Carregador', 100))
                    ->addItem(new Item('Case', 50))
                    ->comObservacoes('Comprei tudinho')
                    ->build();

Você precisa retornar a instancia do builder nos métodos comX():

public function comEmpresa($empresa){
            $this->empresa = $empresa;
        // faltou essa linha
            return $this    
        }

A mesma ideia se repete pros outros métodos.

Abraço.