Olá José tudo bom ? Muito bem observado! Realmente a classe ProcessadorDeInvestimentos vai reclamar pois na classe ContaEstudante
o método rende não existe.
Nosso código roda porque o php é uma linguagem com tipagem dinâmica mas se fossemos colocar um tipo para o Array qual tipo seria? Não tem como pois ambas as classes não tem relação nenhuma entre si. Antes quando usávamos herança poderíamos ter um Array de ContaComum e como ContaEstudante herda de ContaComum poderiamos ter os dois tipos dentro do Array. Lembre-se que a tipagem da linguagem é dinâmica mas para o seu negócio (no caso o banco) a tipagem existe e é importante! Portanto quando percorrer um Array que irá chamar o método rende precisamos de alguma forma garantir que todas as instâncias dentro do Array são instâncias de ContaComum
. E nesse caso quando acontecer o erro na classe ProcessadorInvestimento
é melhor do que fazer um if e acabar deixando um bug passar como no exemplo abaixo:
public function processa() {
$contas = $this->contasDoBanco();
foreach($contas as $conta) {
if($conta instanceof ContaComum) {
$conta->rende();
}
}
}
Nesse caso o processador de investimentos vai ignorar qualquer conta que não é a ContaComum, mas essa é a regra de negócio? Essas contas deveriam ser realmente ignoradas? Pior do que um erro ser lançado é uma lógica ser executada de forma errada e sem nos avisar!
Além disso pensando no design das nossas classes, agora a classe ContaEstudante
não tem o método rende, o que é bem diferente de ter o método e lançar uma exception.