4
respostas

Erro ao acessar atributo protected.

Estou obtendo um erro de acesso ao atributo saldo da classe Conta deste exercício, por que o atributo é inacessível, mesmo as classes estando no mesmo 'pacote'.

Fatal error: Uncaught Error: Cannot access protected property ContaCorrente::$saldo

Na explicação está que: "Tanto a classe que tem o estado quanto os estados estão no mesmo pacote. Perceba que o modificador de acesso dos atributos é protected; ele permite que classes vizinhas enxerguem e manipulem seus atributos."

O correto não seria dizer que as classes filhas, as que estendem Conta, tem acesso?

Na aula o instrutor criou um getValor() na classe Orcamento para ter acesso a este atributo, porem isso na classe Conta perderia um pouco o sentido por conta do encapsulamento desta informação.

Como contornar isso?

4 respostas

Humm... de fato, em JAVA, classes do mesmo pacote permitem o acesso a atributos protegidos, porém, em PHP, atributos com a palavra "protected" estarão acessíveis pela própria classe, pela(s) classes superiores e inferiores hierarquicamente, não importando o pacote (namespace, no caso de PHP).

Estou vendo semelhanças no curso de Design Patterns JAVA aqui da plataforma e, ao que parece, o mesmo exemplo foi utilizado. Se entendi bem seu questionamento, a classe "Orcamento" tem o getValor() e "Conta" também. No entanto, esse método, a meu ver, é útil nas duas pois getValor() deverá receber uma conta e utilizará um método que disponibilize o saldo para que o cálculo do valor do orçamento seja efetuado. Uma coisa é o valor do orçamento, outra é o saldo da conta.

Espero ter ajudado em sua questão.

Oi Alex. Eu digitei errado. Alem do getValor(), a classe Orcamento tem um metodo setValor().

Ah, sim... realmente tem pouca utilidade. Muita gente cria getters e setters automaticamente mesmo que não utilize naquele momento. Pode, realmente, não ser necessário. Se você o excluir, em JAVA a IDE vai apontar o problema. Em PHP você terá que buscar em seu projeto alguma chamada a ele (ou esperar que algum erro apareça, o que não é uma boa ideia). Mas se seu projeto está no início e sabe do impacto em excluir e tem certeza de que não vai precisar dele nesse momento, vá em frente. Se o método não é útil, não precisa existir.

A unica forma que consegui foi fazer uma especie de Observer pattern, mas o acoplamento está alto. Se alguem tiver uma sugestão para diminuir este acoplamento eu gostaria de estudar. Criei uma classe que contem a operacao para ser executada pela Conta ao mudar o Estado.

Obrigado.

class Positivo implements EstadoDaConta{
    public function saca(ContaCorrente $conta, $valor) {
        $montante = $conta->getSaldo() - $valor * 0.98;
        $conta->setProximaOperacao(new Saque($montante));
        if($conta->getSaldo() < 0) $conta->setEstado(new Negativo());
        $conta->atualizaSaldo();
      }

      public function deposita(ContaCorrente $conta, $valor) {

        $montante = $conta->getSaldo() + $valor * 0.98;
        $conta->setProximaOperacao(new Deposito($montante));
        if($conta->getSaldo() > 0) $conta->setEstado(new Positivo());
        $conta->atualizaSaldo();
      }

}
`