1
resposta

Exemplo da importância do uso do final

Professor, Pra fixar, fiz um código mostrando a importância de usar a key word final. Neste exemplo, mostro como burlar uma validação, estendendo a classe CPF e passando pela validação.

Para evitar que isso ocorra, basta usar o key word final na classe CPF ou no método valida.

É isso mesmo ?

<?php
// Enter your code here, enjoy!

class CPF
{
    private $numero;
    public function __construct($num)
    {
        if($this->valida($num)){
            $this->numero = $num;    
        }else{
            echo 'CPF invalido';
            exit();
        }
    }

    protected function valida($num)
    {
        // digamos que validacao seja apenas ter 11 letras
        if(strlen($num) != 11) {
            return false;
        }
        return true;
    }

    public function __toString()
    {
        return $this->numero;
    }
}

class Pessoa
{
    private $name;
    private $cpf;

    public function __construct($name, CPF $cpf)
    {
        $this->name = $name;
        $this->cpf = $cpf;
    }

    public function getDados()
    {
        return "Nome: {$this->name}, CPF: {$this->cpf}" . PHP_EOL;
    }
}

// Classe estendida propositalmente para burlar validacao do CPF
// Isso mostra a importancia de usar a key-word final na classe ou no método de validação
class CPFinvalido extends CPF
{
    protected function valida($num)
    {
        return true;
    }
}

// output: Nome: John Doe, CPF: 12345678910
$umaPessoaCPFValido = new Pessoa(
    'John Doe',
    new CPF('12345678910')
);
echo $umaPessoaCPFValido->getDados();


// output: Nome: Mary Doe, CPF: aaa, deveria ser: CPF inválido
$umaPessoaCPFInvalido = new Pessoa(
    'Mary Doe',
    new CPFinvalido('aaa') // Passando um CPF invalido que burla validacao
);
echo $umaPessoaCPFInvalido->getDados();

1 resposta

Olá, Igor! Tudo bem?

Desculpa a demora por um retorno.

Muito bom ver que você está buscando fixar o conceito de uso da palavra-chave "final" em PHP. No exemplo apresentado, está sendo mostrada de forma prática a importância de utilizar o "final" para evitar que uma classe seja estendida ou que um método seja sobrescrito, parabéns pela elaboração do exemplo!

No código enviado, a classe CPF é estendida pela classe CPFinvalido, que sobrescreve o método valida, burlando a validação do CPF. Isso ocorre porque o método valida é protegido na classe CPF, permitindo que as classes que a estendem possam sobrescrevê-lo.

Para evitar que isso aconteça, como sugerido, podemos utilizar a palavra-chave "final" na declaração da classe CPF ou na declaração do método valida. Ao utilizar o "final" na classe CPF, estaremos impedindo que ela seja estendida por outras classes. Já ao utilizar o "final" no método valida, estaremos impedindo que ele seja sobrescrito pelas classes que estendem a classe CPF.

Aqui está um exemplo de como utilizar o "final" para evitar que a classe CPF seja estendida:

final class CPF
{
    // código da classe CPF
}

E aqui está um exemplo de como utilizar o "final" para evitar que o método valida seja sobrescrito:

class CPF
{
    // código da classe CPF
    
    final protected function valida($num)
    {
        // código do método valida
    }
}

Dessa forma, estaremos garantindo que a classe CPF não seja estendida e que o método valida não seja sobrescrito, mantendo a integridade da validação do CPF.

Espero ter ajudado na complementação e validação do exemplo! Caso tenha ficado alguma dúvida, sinta-se à vontade em comunicar, estou à disposição!

Um forte abraço e bons estudos!

Caso este post tenha te ajudado, por favor, marcar como solucionado ✓