1
resposta

Dúvidas do curso php string-inicial

Ao clicar em Cadastrar e não preencher o formulário da erro

Notice: Undefined offset: 1 in C:\wamp64\www\php\strings-inicial\src\Alura\Usuario.php on line 42 Call Stack

Time Memory Function Location

1 0.0004 404048 {main}( ) ...\cadastro.php:0 2 0.0010 406504 App\Alura\Usuario->__construct( ) ...\cadastro.php:5 3 0.0010 406504 App

\Alura\Usuario->setNomeSobrenome( ) ...\Usuario.php:15

Cadastro.php

<?php

require 'autoload.php';

$usuario = new App\Alura\Usuario($_POST['nome'], $_POST['senha'], $_POST['genero']);
$contato = new App\Alura\Contato($_POST['email'], $_POST['endereco'], $_POST['cep'], $_POST['telefone']);

?>

<!DOCTYPE html>
<html lang="pt-br">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <link rel="stylesheet" href="bootstrap.min.css">
    <title>Curso Strings</title>
</head>

<body>

<div class="mx-5 my-5">
<h1>Cadastro feito com sucesso.</h1>
<p><?php echo htmlspecialchars($usuario->getTratamento()); ?> seguem os dados de sua conta:</p>
<ul class="list-group">
    <li class="list-group-item">Primeiro nome: <?php echo htmlspecialchars($usuario->getNome()); ?></li>
    <li class="list-group-item">Sobrenome: <?php echo htmlspecialchars($usuario->getSobrenome()); ?></li>
    <li class="list-group-item">Usuário: <?php echo htmlspecialchars($contato->getUsuario()); ?></li>
    <li class="list-group-item">Senha:  <?php echo htmlspecialchars($usuario->getSenha()); ?></li>
    <li class="list-group-item">Telefone: <?php echo htmlspecialchars($contato->getTelefone()); ?></li>
    <li class="list-group-item">Email: <?php echo htmlspecialchars($contato->getEmail()); ?></li>
    <li class="list-group-item">Endereço: <?php echo htmlspecialchars($contato->getEnderecoCep()); ?></li>
</ul>
</div>
</body>
</html>
<?php

namespace App\Alura;

class Usuario 
{    
    private $nome;
    private $sobrenome;
    private $senha;
    private $genero;
    private $tratamento;

    public function __construct(string $nome, string $senha, string $genero) 
    {
        $this->setNomeSobrenome($nome);        
        $this->validaSenha($senha);

        $this->adicionaTratamentoAoSobrenome($nome, $genero);
    }

    private function adicionaTratamentoAoSobrenome(string $nome, string $genero)
    {
        if($genero === 'M') {
            $this->tratamento = preg_replace('/^(\w+)\b/', 'Sr', $nome, 1);
        }

        if($genero === 'F') {
            $this->tratamento = preg_replace('/^(\w+)\b/', 'Srª', $nome, 1);
        }
    }

    private function setNomeSobrenome(string $nome) 
    {
        $nomeSobrenome = explode(" ", $nome, 2);

        if($nomeSobrenome[0] === ""){
            $this->nome = "Nome inválido";
        } else {
            $this->nome = $nomeSobrenome[0];
        }

        if($nomeSobrenome[1] === null){
            $this->sobrenome = "Sobrenome inválido";
        } else {
            $this->sobrenome = $nomeSobrenome[1];
        }
    }

    public function getNome():string 
    {
        return $this->nome;
    }

    public function getSobrenome():string 
    {
        return $this->sobrenome;
    }

    public function getSenha(): string
    {
        return $this->senha;
    }

    private function validaSenha(string $senha): void 
    {
        $tamanhoSenha = strlen(trim($senha));

        if ($tamanhoSenha > 6) {
            $this->senha = $senha;
        } else {
            $this->senha = "Senha inválida";
        }
    }

    public function getTratamento(): string 
    {
        return $this->tratamento;
    }
}

?>

Não sei onde está o erro, já conferi os códigos do curso e não funcionou da erro, e no curso não apresenta esse erro. Aguardo resposta.

Att: Cezar

1 resposta

Olá, Cezar. Tudo bem?

Primeiramente gostaria de pedir desculpas pela demora em dar um retorno em sua dúvida.

O erro: "Notice: Undefined offset: 1" significa que estamos tentando realizar uma operação com um array, entretanto, estamos buscando por um item inexistente.

O erro acontece na função setNomeSobrenome():

private function setNomeSobrenome(string $nome) 
    {
        $nomeSobrenome = explode(" ", $nome, 2);

        if($nomeSobrenome[0] === ""){
            $this->nome = "Nome inválido";
        } else {
            $this->nome = $nomeSobrenome[0];
        }

        if($nomeSobrenome[1] === null){ // acontece nesta verificação 
            $this->sobrenome = "Sobrenome inválido";
        } else {
            $this->sobrenome = $nomeSobrenome[1];
        }
    }

Neste caso o que ocorreu foi que o método explode() tenta dividir o texto contido em nomeCompleto, porém ele não consegue, porque provavelmente no formulário você inseriu apenas o nome, sem informar o sobrenome. Em outras palavras $nomeSobrenome[1] não existe.

Gostaria de aproveitar a oportunidade e te recomendar a atualização deste curso de PHP Strings: manipulando textos com PHP, este curso vai abordar as novidades do PHP 8 sobre strings.

Espero ter ajudado, bons estudos!

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