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

Typed Property must be a instance of Desconto, null given

Boa Tarde,

Na aula 2, Quando vou executar o código de teste da calculadora de descontos, me retorna o seguinte erro:

Fatal error: Uncaught TypeError: Typed property Alura\DesignPattern\Descontos\Desconto::$proximoDesconto must be an instance of Alura\DesignPattern\Descontos\Desconto, null used in /var/www/src/Descontos/Desconto.php:13

Estou usando o PHP 7.4.10, e meu código se encontra assim:

Desconto.php

<?php

namespace Alura\DesignPattern\Descontos;

use Alura\DesignPattern\Orcamento;

abstract class Desconto
{
    protected Desconto $proximoDesconto;

    public function __construct(?Desconto $proximoDesconto)
    {
        $this->proximoDesconto = $proximoDesconto;
    }

    abstract public function calculaDesconto(Orcamento $orcamento);
}

CalculadoraDeDescontos.php

<?php

namespace Alura\DesignPattern;

use Alura\DesignPattern\Orcamento;
use Alura\DesignPattern\Descontos\DescontoMaisDe5Itens;
use Alura\DesignPattern\Descontos\DescontoMaisDe500Reais;
use Alura\DesignPattern\Descontos\SemDesconto;

class CalculadoraDeDescontos
{
    public function calcularDesconto(Orcamento $orcamento)
    {
        $cadeiaDeDescontos = new DescontoMaisDe5Itens(
            new DescontoMaisDe500Reais(
                new SemDesconto(null)
            )
        );

        return $cadeiaDeDescontos->calculaDesconto($orcamento);
    }
}
1 resposta
solução!

Resolvi o problema! A questão é que no arquivo Desconto.php, eu deveria colocar o atributo também com o ponto de interrogação, deste jeito:

    protected ?Desconto $proximoDesconto;