Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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.
ObrigadoOpa,
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!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'));
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
{
class Cliente extends Usuario
{
// Result: 176480ebb4d064b18d8397f359f8fb7f // Result: dafd
Possa ser que tenha outras formas