Ir para conteúdo
Luiz Henrique

Problema com herança de classes

Recommended Posts

Olá pessoas.

Segue code depois explico.

 

class Usuario
{      
  public $email;
  private $senha;
  public function alteraSenha($senha)
  {
    $this->senha = md5($senha);
  }
}
class Cliente extends Usuario
{
  public function __construct($email = null, $senha = null)
  {
    $this->email = $email;
    $this->senha = ($senha);
  }
}
$cliente = new Cliente("mail@mail.com","123456");

o retorno disso é: mail@mail.com / 123456. OK

Porém preciso tratar a senha e passar pela função alteraSenha e já tentei:

$cliente = new Cliente("mail@mail.com");
$cliente->alterSenha('12346');

Também assim dentro da classe Cliente:

public function setSenha($senha)
      {
        parent::alteraSenha($senha);
      }

Dentro do __construct:

$this->senha = alteraSenha($senha);

 

E em todas as opções, o retorno da senha fica vazio, não dá erro mas volta vazio.

A única forma de  funcionar é fazendo a declaração diferente:

$cliente = new Cliente();
$cliente->email = "mail@mail";
$cliente->setSenha('12356');

Dessa forma funciona, mas eu queria a declaração da outra forma para otimizar linhas.

O que estou fazendo errado.

 

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Estou um pouco desatualizado no PHP mas como a senha está como private ela não pode ser acessada pelas subclasses como a Cliente.

Não sei atualmente como está os métodos mágicos do php para usar getters e setters básico é usar assim:

class Usuario
{      
  public $email;
  private $senha;
  public function alteraSenha($senha)
  {
    $this->setSenha(md5($senha));
  }

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

  public function setSenha($senha) {
    $this->senha = $senha;
  }
}

E na classe cliente usar da seguinte forma:

class Cliente extends Usuario
{
  public function __construct($email = null, $senha = null)
  {
    $this->email = $email;
    $this->setSenha($senha);
  }
}

E instanciar da forma que você falou:

$cliente = new Cliente("mail@mail.com");
$cliente->alteraSenha('aqui');

echo $cliente->getSenha();
// Result: 176480ebb4d064b18d8397f359f8fb7f

$cliente = new Cliente("mail@mail.com", "dafd");
echo $cliente->getSenha();
// Result: dafd

Possa ser que tenha outras formas

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa, 

Então, não funcionou também, mas no fim mudei de private para protected e foi, se alguém precisar dei uma enxugada no code para ficar mais fácil de entender, segue:

 

class Usuario
  {
    public $usuario;
    protected $senha;

    public function setSenha($senha)
    {
      $this->senha = md5($senha);
    }   

  }

  class Admin extends Usuario
  {
    function __construct($usuario = null, $senha = null)
    {
      $this->setSenha($senha);
      $this->usuario = $usuario;
    }
    function getAdmin()
    {
      return "<b>Usuario:</b> <i>".$this->usuario."</i> <b>Senha:</b> <i>".$this->senha."</i><br>";;
    }
  }



  $admin = new Admin("admin","123456");
  echo $admin->getAdmin();

Obrigado! 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Primeiro vamos esclarecer o porque de usar herança em classes.

Digamos por exemplo que eu tenha classe_A, classe_B, classe_C; em ambas classes eu precise executar uma tarefa que se repete nelas....

Se não precisamos de algo recursivo a herança é desnecessária.

Porém nesse requisito de repetição trabalhamos com uma classe mãe que vai executar essas tarefas que são específicas da classe mãe, portanto a classe mãe torna-se algo com importância tão relevante que seu acesso deve ser restrito.

Ou seja não é adequado que ela possua dados públicos que podem ser manipulados de forma leviana.

Em outras palavras nada de usar public em uma classe mãe que possui uma responsabilidade maior.

 

Um construtor.... Um construtor de uma classe é somente para definir com quais dados/comportamento a classe deve possuir antes de usar qualquer tarefa que ela venha a fazer, caso não precisamos desses dados iniciais em todos os métodos seguintes não é necessário um construtor.

 

Fora do contexto de classe, mas na questão do tópico: É muito estranho que em "pleno século 21" alguém ainda pensa em usar md5 para criptografia de senha, qualquer string é facilmente decifrada com o md5.

Se você quer segurança use o password_hash que lança um novo salt a cada execução. Porém qualquer desses você pode registrar que numa comparação se for a mesma string o retorno é sempre verdadeiro.

 

<?php
class ClasseMae {

    private $pass;
    private $newPass;

    private function novaSenha() {
        $this->newPass = password_hash($this->pass, PASSWORD_DEFAULT);
    }

    protected function alteraSenha($pass) {
        $this->pass = htmlentities($pass);
        $this->novaSenha();
    }

    protected function retornarSenha() {
        return (empty($this->newPass) ? null : $this->newPass);
    }

}

Perceba a responsabilidade da classe as quais filhas vão herdar seus métodos. O que uma filha pode acessar é protegido o que ela não pode mexer é privado.

Ou senha nenhum objeto tem acesso a nada na mãe para que não possa manipular-la de forma alguma, porque ela é a mãe e não pode sofrer interferência de ninguém.

<?php
class ClasseFilha extends ClasseMae {

    public function modificarSenha($senha) {
        $this->alteraSenha($senha);
    }

    public function verSenha() {
        return ($this->retornarSenha());
    }

    public function compararSenha($novaSenha) {
        if (password_verify($novaSenha, $this->retornarSenha())) {
            return (true);
        } else {
            return (false);
        }
    }
}

Note que então numa filha seus métodos são públicos pois sua responsabilidade é só receber/usar o que a mãe tem a oferecer.

 

Por fim vejamos um exemplo de execução

<?php
$objeto = new ClasseFilha();

$objeto->modificarSenha('12345');
var_dump($objeto->verSenha());

echo ("<hr />");
var_dump($objeto->compararSenha('54321'));

echo ("<hr />");
var_dump($objeto->compararSenha('12345'));

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

  • Conteúdo Similar

    • Por Sapinn
      Boa pessoal. Então, estou fazendo um sistema para uma loja de manutenção de aparelhos eletrônicos, e eu tenho um formulário de cadastro onde eu posso inserir os dados de um cliente e os dados do seu aparelho. E eu consigo cadastrar simultaneamente cada um em suas respectivas tabelas. O que eu gostaria de fazer era assim que cadastra-se o cliente pega-se o seu id( Nesse caso o ultimo id inserido) e inserisse na tabela serviços junto. No PDO tem um jeito de fazer isso que é usando o lastInsertId() mas eu não estou sabendo como retornar esse ultimo id para fazer essa inserção
    • Por Sapinn
      Iai galera beleza? Estou com um erro simples aqui como eu faço para estender minha conexão para outros arquivos ? Estou tentado fazer mas está dado um erro aqui
       
      arquivo connection.php
       
      <?php
      class Conexao{
          public $db_name = 'pessoa';
          public $host = 'localhost';
          public $user = 'root';
          public $pass = '';
       
          public function __construct()
          {
              try {
                  $pdo = new PDO("mysql:db_name=".$this->db_name.";host=".$this->host,$this->user,$this->pass);                                         
              } catch (PDOException $e) {
                  echo "Erro no banco ".$e->getMessage();
                  exit();
              }
          }
           
      }
       
      arquivo Pessoa.php
       
      <?php
      include 'connection.php';
      class Pessoa {
          private $pdo;
       
          public function __construct()
          {   
              $this->pdo = new Conexao();
          }
       
          public function buscarDados(){
              $stmt = [];
              $sql = $this->pdo->query("SELECT * FROM pessoa
              order by id desc");
              $stmt = $sql->fetchAll(PDO::FETCH_ASSOC);
              return $stmt;
          }
      }
       
      arquivo index.php
       
      <?php
          require_once 'models/Pessoa.php';
          $p = new Pessoa();
      ?>
      <!DOCTYPE html>
      <html lang="pt-br">
      <head>
          <meta charset="UTF-8">
          <meta http-equiv="X-UA-Compatible" content="IE=edge">
          <meta name="viewport" content="width=device-width, initial-scale=1.0">
          <link rel="stylesheet" href="assets/css/style.css">
          <title>Crud PDO </title>
      </head>
      <body>
          <section id="esquerda">
              <form action="">
                  <h2>Cadastrar Pessoa</h2>
                  <label for="nome">Nome: </label>
                  <input type="text" name="nome" id="nome">
                  <label for="telefone">Telefone: </label>
                  <input type="text" name="telefone" id="telefone">
                  <label for="email">Email:</label>
                  <input type="text" name="email" id="email">
                  <input type="submit" value="Cadastrar">
              </form>
          </section>
          <section id="direita">
          <?php
              $p->buscarDados();
          ?>
              <table>
                  <tr id="titulo">
                      <td>Nome</td>
                      <td>Telefone</td>
                      <td colspan="2">Email</td> 
                  </tr>
                  <tr>
                      <td>Maria</td>
                      <td>00000000</td>
                      <td>maria@gmail.com</td>
                      <td><a href="">Editar</a> <a href="">Excluir</a></td>
                  </tr>
              </table>
          </section>
      </body>
      </html>
       
      Erro que é apresentado:
      Fatal error: Uncaught Error: Call to undefined method Conexao::query()
    • Por Sapinn
      Estou com dificuldade para chamar um arquivo CSS usando a configuração de um arquivo php. O bootstrap também não surte efeito na paginas
       
      Vejam só
      Config.php
       
      <?php define('APP_NOME','Projeto GIBI'); define('URL','http://localhost/bora_php');  
       
      index.php
       
      <?php include './../app/configuracao.php'; include './../app/Libraries/Rota.php'; include './../app/Libraries/Controller.php'; ?> <!DOCTYPE html> <html lang="pt-br"> <head>     <meta charset="UTF-8">     <meta name="viewport" content="width=device-width, initial-scale=1.0">     <link rel="stylesheet" href="<?=URL?>/public/css/estilos.css">     <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css" >         <title><?= APP_NOME?></title> </head> <body>     <?php         $rotas = new Rota();     ?>     <script src="https://code.jquery.com/jquery-3.5.1.min.js" ></script> <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js"></script> <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/js/bootstrap.min.js" ></script> <script src="<?=URL?>/public/css/script.js" ></script> </body> </html> estilo.css
      html{     background-color: red; }  
      Estou tentando seguir a padronização MVC(que por sinal eu tenho certa dificuldade), então não consigo achar onde estou errando
    • Por lucascientista
      Boa noite pessoal, sou iniciante no php e tenho uma dúvida que eu acho que pode ser bem simples para vocês que estão mais avançados do que eu. Bom, eu gostaria de saber como usar a orientação ao objeto para cadastro no banco de dados - mysql, só que eu não sei fazer da maneira orientada ao objeto e gostaria de saber.
       
      <?php class Pessoa { $nome; $sobrenome; $endereço; } gostaria de saber como usar uma classe parecida a de cima com o banco de dados
      Muito obrigado, toda ajuda é bem vinda
    • Por LuanMartinsTI
      Eu gostaria de saber se existe algum problema relacionado a seguranca criando uma funcao assim, no exemplo sempre que eu crio uma funcao pre reutilizar os dados sao passados direto na chamada da funcao dentro do php, o usuario nao insere nenhum dado, quando o usuario vai inserir dados eu nao trabalho dessa forma, entao minha duvida [e, se mesmo o parametro da funcao sendo informado dentro do php no codigo pode existir algum problema.
      public function contar_cadastro($tabela, $sql){ try { if($sql == null){ $this->Select = $this->Conn->prepare("SELECT * FROM $tabela"); $this->Select->execute(); return $this->Select->rowCount(); }else{ $this->Select = $this->Conn->prepare("SELECT * FROM $tabela". " " ." $sql"); $this->Select->execute(); return $this->Select->rowCount(); } } catch (PDOException $exc) { exibeMensagens($Msg, $ErrNo); } } E as chamadas das funcoes assim
       
      $cmsPDO = new CmsPDO(); $r_userStaff = $cmsPDO->contar_cadastro('usuarios', ' where cargo > 2'); $r_userVip = $cmsPDO->contar_cadastro('usuarios', ' where cargo = 2'); $r_userBan = $cmsPDO->contar_cadastro('usuarios', " where ban = '1'"); $r_usuarioPDO = $cmsPDO->contar_cadastro('usuarios', null); $r_servVip = $cmsPDO->contar_cadastro('servidores', " where vipfree = 'V'"); $r_servFree = $cmsPDO->contar_cadastro('servidores', " where vipfree = 'F'"); $r_servInat = $cmsPDO->contar_cadastro('servidores', " where verificado = '1'"); $r_servOff = $cmsPDO->contar_cadastro('servidores', " where estado = 'Off'"); $r_servOn = $cmsPDO->contar_cadastro('servidores', " where estado = 'On'"); $r_servidores = $cmsPDO->contar_cadastro('servidores', null); Eu normalmente crio as funcoes assim:
      public function cadastrar_usuario($usuario){ try { if($this->veriricarnick($usuario) == false){ if($this->verificiarEmail($usuario) == false){ $query = 'INSERT INTO usuarios ' . '(id, nome, senha, email, cargo, ip)' . 'value(null,:nome, :senha, :email, :cargo, :ip)'; $this->Criar = $this->Conn->prepare($query); $this->Criar->bindValue(':nome' , $usuario->getNome() , PDO::PARAM_STR); $this->Criar->bindValue(':senha' , $usuario->getSenha(), PDO::PARAM_STR); $this->Criar->bindValue(':email' , $usuario->getEmail(), PDO::PARAM_STR); $this->Criar->bindValue(':cargo' , $usuario->getCargo(), PDO::PARAM_INT); $this->Criar->bindValue(':ip' , $usuario->getIp() , PDO::PARAM_STR); $this->Criar->execute(); if($this->Criar->rowCount() == 1){ return 1; }else{ return false; } }else{ return false; } }else{ return false; } } catch (PDOException $exc) { exibeMensagens("<b> Erro ao inserir.</b> Mensagem:{$exc->getMessage()} Código: {$exc->getCode()}", WS_ERROR); } }  
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.