1
resposta

Proposta de solução do desafio - exceptions validador de CPF e nome

Saudações,

Segue minha ideia de solução do desafio:

<?php

namespace Alura\Banco\Modelo;


final class CPF // extends (se herdar comortamento de oura classe) AnotherClass implements Interface
{

   private string $cpf; 


   public function __construct(string $cpf)
   {
        $mensagem = $this->validaCPF($cpf);
        try{
            if (strlen($mensagem)==0){
                $this->cpf=$cpf;
            }else{
                throw new \InvalidArgumentException();
            }
        }catch(\InvalidArgumentException $exception){
            echo $mensagem;
            exit;
        }
   }


    private function validaCPF(string $cpf) //privado para ser acessado internamente
    {
        // Extrai somente os números
        $cpf = preg_replace( '/[^0-9]/is', '', $cpf );

        // Verifica se foi informado todos os digitos corretamente
        if (strlen($cpf) != 11) {
           return 'O CPF deve ter 11 posições!'.PHP_EOL;
        }

        // Verifica se foi informada uma sequência de digitos repetidos. Ex: 111.111.111-11
        if (preg_match('/(\d)\1{10}/', $cpf)) {
            return 'Favor informar um CPF válido! '.PHP_EOL;
        }

        // Faz o calculo para validar o CPF
        for ($t = 9; $t < 11; $t++) {
            for ($d = 0, $c = 0; $c < $t; $c++) {
                $d += $cpf[$c] * (($t + 1) - $c);
            }
            $d = ((10 * $d) % 11) % 10;
            if ($cpf[$c] != $d) {
                return 'Verifique o número digitado'.PHP_EOL;
            }
        }
    }

    public function recuperaNumero()
    {
        return $this->cpf;
    }
}

valida nome:

final protected function validaNome(string $nome) //metodo protegido, acessado pelas classes filhas
{
    try{
        if (strlen($nome) < 5) {
            throw new \InvalidArgumentException(); 
        }else{
            return mb_strtoupper($nome);
        }
    }catch (\InvalidArgumentException $e){
        echo "Nome precisa ter pelo menos 5 caracteres".PHP_EOL;
        exit;
    }
}

Aguardo sugestões de melhorias.

Obrigada

1 resposta

Muito bom Elaine, parabéns!

Caso você queira aproveitar alguma ideia aqui está uma classe implementada por mim e sem o cálculo real de validação, apenas para fins didáticos.

class CPF
    {
      private string $cpf;

      public function __construct(string $cpf)
      {
         if(! $this->ehCPF($cpf)) {
          throw new \DomainException('Informe um CPF válido:: 11 dígitos [0-9]');
        }

        $this->cpf = $cpf;
      }

      private function ehCPF(string $cpf): bool
      {
        return preg_match('/^\d{11}$/', $cpf);
      }

      private function formataCPF(): string
      {
          $pattern_src = '/^(\d{3})(\d{3})(\d{3})(\d{2})$/';
          $pattern_rpl = "$1.$2.$3-$4";

          return preg_replace($pattern_src, $pattern_rpl, $this->cpf);
      }

      public function __toString(): string
      {
        return $this->formataCPF();
      }
    }

Exemplo de execução do código:

    try {
      echo 'CPF válido:' . new CPF('83848382838') . '  ';
      echo 'Capturando a mensagem da exception:  ';
      new CPF('39492');
    } catch (Exception $e) {
      echo $e->getMessage();
    }

Bons estudos!