Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

ene1

Seria uma "má prática" ter dois construtores numa classe?

Recommended Posts

Tenho uma classe de Usuário com seus gets e sets, e o construtor com seu nome, email, senha, etc.

Em outra classe (UsuarioDados), eu tenho uma função que cadastra o usuário no banco de dados.

function cadastrar(Usuario $usuario){
$usuario->getNome();
}

Em outro arquivo php eu instancio a classe usuário e chamo o método de cadastrar.

$UsuarioDado = new UsuarioDado();
$usuario = new Usuario($nome, email);
$UsuarioDado->cadastrar($usuario);

Agora eu quero criar o método de verificar o login, mas teria que criar um construtor contendo apenas o nome e e-mail.

Teria algum problema em fazer isso?

Compartilhar este post


Link para o post
Compartilhar em outros sites

O nome dessa operação criação de mais de um construtor para uma mesma classe, chama-se sobrecarga de construtor, caso queira saber mais vá no site da Caelum: lá tem apostila é de Java mas versa bastante assuntos de O.O. O download das apostilas é gratuito.

Compartilhar este post


Link para o post
Compartilhar em outros sites

$UsuarioDado = new UsuarioDado();
$usuario = new Usuario($nome, email);
$UsuarioDado->cadastrar($usuario);

Essa Classe Usuário é uma entidade, por que ela está recebendo parâmetros pelo construtor?

Faça o encapsulamento dos getters e setters da Entidade Usuario, nos objetos das classes que for usar, pois já é seus atributos.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Essa Classe Usuário é uma entidade, por que ela está recebendo parâmetros pelo construtor?

Faça o encapsulamento dos getters e setters da Entidade Usuario, nos objetos das classes que for usar, pois já é seus atributos.

Então Williams, a forma que encontrei de instanciar o usuário foi colocando os atributos no construtor, sem os atributos (ex: $usuario = new Usuario() ) apresentava erro.

Faça o encapsulamento dos getters e setters da Entidade Usuario, nos objetos das classes que for usar, pois já é seus atributos

Você poderia explicar melhor? não consegui muito bem entender o que você disse.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Segue um exemplo básico

Usuario.php

<?php


class Usuario {

    private $nome;
    private $email;
    private $senha;

    /**
     * @param mixed $email
     */
    public function setEmail($email)
    {
        $this->email = $email;
    }

    /**
     * @return mixed
     */
    public function getEmail()
    {
        return $this->email;
    }

    /**
     * @param mixed $nome
     */
    public function setNome($nome)
    {
        $this->nome = $nome;
    }

    /**
     * @return mixed
     */
    public function getNome()
    {
        return $this->nome;
    }

    /**
     * @param mixed $senha
     */
    public function setSenha($senha)
    {
        $this->senha = $senha;
    }

    /**
     * @return mixed
     */
    public function getSenha()
    {
        return $this->senha;
    }


}

UsuarioDAO.php

class UsuarioDAO {


    public function cadastrar(Usuario $usuario) {

        echo "Cadastrar: \n";
        echo $usuario->getNome();
        echo "\n";
        echo $usuario->getEmail();
        echo "\n";
        echo $usuario->getSenha();

    }


    public function login(Usuario $usuario) {

        echo "\n\nLogin: \n";
        echo $usuario->getEmail();
        echo "\n";
        echo $usuario->getSenha();

    }


}

Uso

$usuario = new Usuario();
$usuarioDAO = new UsuarioDAO();

$usuario->setNome('ene1');
$usuario->setEmail('ene1@site.com');
$usuario->setSenha('123456');


$usuarioDAO->cadastrar( $usuario );
$usuarioDAO->login( $usuario );

Dessa forma voce pode extender sua model ou passar por DI sua conexão, você escolhe.

Não preciso explicar o que é DI né?
Isso você já deve ter estudado.

IDEONE

http://ideone.com/mJ42Cf

Compartilhar este post


Link para o post
Compartilhar em outros sites

Segue um exemplo básico

Usuario.php

<?php


class Usuario {

    private $nome;
    private $email;
    private $senha;

    /**
     * @param mixed $email
     */
    public function setEmail($email)
    {
        $this->email = $email;
    }

    /**
     * @return mixed
     */
    public function getEmail()
    {
        return $this->email;
    }

    /**
     * @param mixed $nome
     */
    public function setNome($nome)
    {
        $this->nome = $nome;
    }

    /**
     * @return mixed
     */
    public function getNome()
    {
        return $this->nome;
    }

    /**
     * @param mixed $senha
     */
    public function setSenha($senha)
    {
        $this->senha = $senha;
    }

    /**
     * @return mixed
     */
    public function getSenha()
    {
        return $this->senha;
    }


}

UsuarioDAO.php

class UsuarioDAO {


    public function cadastrar(Usuario $usuario) {

        echo "Cadastrar: \n";
        echo $usuario->getNome();
        echo "\n";
        echo $usuario->getEmail();
        echo "\n";
        echo $usuario->getSenha();

    }


    public function login(Usuario $usuario) {

        echo "\n\nLogin: \n";
        echo $usuario->getEmail();
        echo "\n";
        echo $usuario->getSenha();

    }


}

Uso

$usuario = new Usuario();
$usuarioDAO = new UsuarioDAO();

$usuario->setNome('ene1');
$usuario->setEmail('ene1@site.com');
$usuario->setSenha('123456');


$usuarioDAO->cadastrar( $usuario );
$usuarioDAO->login( $usuario );

Dessa forma voce pode extender sua model ou passar por DI sua conexão, você escolhe.

Não preciso explicar o que é DI né?

Isso você já deve ter estudado.

IDEONE

http://ideone.com/mJ42Cf

O seu exemplo está praticamente igual com o que estou fazendo.

Na parte do uso, estou fazendo um pouco diferente, estou passando o POST nas variáveis. Mas não estou utilizando os sets.

$nome = $_POST['nome'];

$usuario = new Usuario($nome, email);
$UsuarioDado->cadastrar($usuario);

Portanto, o construtor do usuário está pegando as variáveis do formulário. Você recomenda fazer isso de alguma outra forma?

Compartilhar este post


Link para o post
Compartilhar em outros sites

O seu exemplo está praticamente igual com o que estou fazendo.

Ops! Verdade, mas atente-se aos princípios da responsabilidade única, mas seguindo um padrão você dará mais consistência a sua aplicação, por enquanto no que você apresentou não há nada disso.

Leia mais aqui

Portanto, o construtor do usuário está pegando as variáveis do formulário. Você recomenda fazer isso de alguma outra forma?

Siga os padrões de projeto e estude injeção de dependência.

Vale a pena a leitura de alguns tópicos selecionados do padrão GOF.

http://forum.imasters.com.br/topic/402329-padroes-gof/

Compartilhar este post


Link para o post
Compartilhar em outros sites

ene1, pode mostrar como você está fazendo?

Função de inserção no BD:

public function inserirUsuario(Usuario $usuario) {
        $con = Conexao::getInstance();
        $sql = "insert into usuarios (nome, sobrenome, cpf, email, senha) values (:nome, :sobrenome, :cpf, :email, :senha)";
        $stmt = $con->prepare($sql);
        $stmt->bindValue("nome", $usuario->getNome(), PDO::PARAM_STR);
        $stmt->bindValue("sobrenome", $usuario->getSobrenome(), PDO::PARAM_STR);
        $stmt->bindValue("cpf", $usuario->getCpf(), PDO::PARAM_STR);
        $stmt->bindValue("email", $usuario->getEmail(), PDO::PARAM_STR);
        $stmt->bindValue("senha", $usuario->getSenha(), PDO::PARAM_STR);
        $stmt->execute();
    }

Arquivo php contendo os POST para o formulário HTML

if (isset($_POST['cadastrarUsuario'])){
    $nome = $_POST['nome'];
    $sobrenome = $_POST['sobrenome'];
    $cpf = $_POST['cpf'];
    $email = $_POST['email'];
    $senha = $_POST['senha'];
    
    $usuarioDAO = new UsuarioDAO();
    $usuario = new Usuario($nome, $sobrenome, $cpf, $email, $senha);
    $usuarioDAO->inserirUsuario($usuario);
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

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