Olá, na solucao oferecida abaixo no curso , especificamente no capitulo "Pattern State PHP" nao concordo com a solução, inclussive apliquei para testar e o resutado foi o esperado, a toda vez que chamado aplicaDesconto a variavel $descontoAplicado é inicializada como false, por este motivo a solução oferecida continua liberando para aplicar desconto indefinidamente.
Observe que os estados EM APROVAÇÃO e APROVADO dão desconto extra. O problema é que eles permitem com que esse desconto seja dado infinitamente. Faça com que esse desconto só seja aplicado apenas uma vez. Na segunda, uma exceção deve ser lançada.
RESPONDER Opinião do Instrutor
Semelhante ao ítem anterior, ambos os estados implementam EstadoDeUmOrcamento e implementam a regra de negócio específica quando o orçamento está naquele estado.
class EmAprovacao implements EstadoDeUmOrcamento { private $descontoAplicado = false; public function aplicaDescontoExtra(Orcamento $orcamento) { if(!$this->descontoAplicado) { $orcamento->valor -= $orcamento->valor * 0.05; $this->descontoAplicado = true; } else { throw new Exception("Desconto já aplicado!"); } }