Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Problema para capturar exception de nome.

Olá, pessoal.

Meu código é esse:

<?php
namespace src\Excecoes;

class NomeCurtoException extends \DomainException {
    public function __construct(){
        $mensagem = "Poucas letras para um nome.";
        parent::__construct($mensagem);
    }
}

Na classe Pessoa.php:

protected function validarNome(string $nome){
    if(strlen($nome) < 4){
        throw new NomeCurtoException();
    }
}

No arquivo de teste:

<?php
require_once 'autoload.php';

use src\Titular;
use src\Excecoes\NomeCurtoException;
use src\Excecoes\SaldoInsuficienteException;
use src\Modelo\CPF;
use src\Modelo\Endereco;
use src\ContaCorrente;

$endereco = new Endereco("rua A", "num 1", "B", "C");
$cpf = new CPF("123.456.789-10");
try{
    $contaUm = new ContaCorrente(new Titular("J", $cpf, $endereco));
    $contaUm->depositar(100);
    $contaUm->sacar(500);
} catch(InvalidArgumentException $e){
    echo "Valor incorreto para deposito. Refaca.".PHP_EOL;
} catch(NomeCurtoException $e){
    echo $e->getMessage();
    echo "Nome tem que ter pelo menos 4 caracteres".PHP_EOL;
} catch(SaldoInsuficienteException $e){
    echo $e->getMessage().PHP_EOL;
}

$contaUm->exibirConta();

Resultado:

C:\Users\Rômulo\Documents\Projetos-PHP\poo-php>php banco.php Voce tentou sacar 525, mas so tem 100 em conta CPF: 123.456.789-10 Nome: J Saldo: 100

Quando rodo o arquivo, ele ainda passa o nome com menos de 4 caracteres. Não consigo entender por que isso acontece. Já fiz testes com os valores de saque e depósito e tá tudo ok. Só o do nome que não executa. Alguém pode me ajudar, por favor?

4 respostas

Oi Rômulo, tudo certo com a Class e a function validarNome

Tem q ver se vc está realmente chamando a função validarNome

Opa, Luis. Realmente, não estava sendo chamado. Tentei chamar a função no construtor, mas não deu certo. Ele mostra:

Fatal error: Uncaught Error: Call to undefined function src\Modelo\validarNome() in C:\Users\R├┤mulo\Documents\Projetos-PHP\poo-php\sr
c\Modelo\Pessoa.php:15
Stack trace:
#0 C:\Users\R├┤mulo\Documents\Projetos-PHP\poo-php\src\Titular.php(14): src\Modelo\Pessoa->__construct('Joao', Object(src\Modelo\CPF))

#1 C:\Users\R├┤mulo\Documents\Projetos-PHP\poo-php\banco.php(16): src\Titular->__construct('Joao', Object(src\Modelo\CPF), Object(src\
Modelo\Endereco))
#2 {main}
  thrown in C:\Users\R├┤mulo\Documents\Projetos-PHP\poo-php\src\Modelo\Pessoa.php on line 15

o Código total de Pessoa.php é esse:

<?php
namespace src\Modelo;

use src\Excecoes\NomeCurtoException;

abstract class Pessoa
{
    protected string $nome;
    private CPF $cpf;

    public function __construct(string $nome, CPF $cpf){
//         if(strlen($nome) < 4){
//             throw new NomeCurtoException();
//         }
//         $this->nome = $nome;
        validarNome($nome);
        $this->nome = $nome;
        $this->cpf = $cpf;
    }

    public function recuperarNome()
    {
        return $this->nome;
    }

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

    protected function validarNome(string $nome): string{
        if(strlen($nome) < 4){
            throw new NomeCurtoException();
        } else{
            return $nome;
        }
    }
}

com else ou sem, ele dá o erro lá em cima.

Aí, eu fiz a validação direto no construtor, usando if e fluiu.

Sabe por que dá esse erro? Será que é porque não é permitido chamar funções dentro do construtor?

solução!

Oi Rômulo, faltou o $this

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

  protected function validarNome(string $nome): string
  {
        if(strlen($nome) < 4) 
            throw new NomeCurtoException();

        return $nome;

    }

Show meu amigo. Vou testar aqui. Obrigado pela ajuda.