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