Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Oi Pessoal,
estou iniciando em php OOP e estou criando um padrão factory para os usuários do sistema.
Tenho basicamente 3 usuários: clientes, funcionários e diretores.
Meu código é o seguinte:
class Usuario{
protected $values;
protected $id;
protected $db;
protected $_nome;
protected $_email;
protected $_senha;
protected $_status = 1;
protected $_criador;
protected $iNome;
protected $iEmail;
function __construct($nome, $email, $senha, $status, $criador){
global $db;
$this->db=$db;
$this->_nome=$nome;
$this->_email=$email;
$this->_senha=$senha;
$this->_status=$status;
$this->_criador=$status;
}
//PERMISSÕES
function hasLoginPermission(){
return true;
}
function hasDeletePermission(){
return false;
}
function hasInsertPermission(){
return false;
}
function hasUpdatePermission(){
return false;
}
//CRUD
}
Minha classe funcionário:
class Funcionario extends Usuario{
protected $_setor;
function __construct($dados = array()){
if(!count($dados)==6)
throw new exception("Número de argumentos inválido para criar o funcionário.");
$this->_nome=$dados['nome'];
$this->_email=$dados['email'];
$this->_senha=$dados['senha'];
$this->_status=$dados['status'];
$this->_criador=$dados['criador'];
$this->_setor=$dados['setor'];
$this->tabela='usuarios';
parent::__construct($nome, $email, $senha, $status, $criador);
$campos = array("nome"=>$nome, "email"=>$email, "setor"=>$setor, "senha"=>$senha, "status"=>$status);
}
function setnome($nome){
$this->_nome=$nome;
}
function getNome(){
return $this->_nome;
}
function hasDeletePermission(){
return false;
}
function hasInsertPermission(){
return true;
}
function hasUpdatePermission(){
return true;
}
//CRUD
public function insert()
...//GET
//VALIDAÇÃO
public function Valida(){
$iNome = new Campo($this->_nome, new ValidaNaoVazio());
$iEmail = new Campo($this->_email, new ValidaEmail());
$iSetor = new Campo($this->_cpf, new ValidaCpf());
}
}
Quando faço isso:
$dados = array("nome"=>"Juliano", "email"=>"juliano@virtualcriativa.com.br", "senha"=>"1324", "status"=>"1", "criador"=>"1", "setor"=>"Consultor" );
$teste = userfactory::Create("Funcionario", $dados);
echo $teste->getNome();
Ele não imprime o nome do funcionário. Dei print_r no construct da Funcionário e ele recebe os dados corretamente. Também dei echo nos dados no array que tb estão corretos.
O que está errado?
Outra dúvida, adianta alguma coisa implementar o CRUD, GETS e SETS na Usuario ou devo deixar para as classes filha?
Obrigado!
Obrigado Andrey, mas não funcionou.
Na verdade, se eu removo da classe funcionário a linha que chama o construct da Usuario, aí funciona, mas eu imaginava que o ideal era mover o máximo possível de informação para a classe superior, por isso mantive o construct da Usuário na Fuuncionario. Com isso eu imaginava que todos os atributos em comum fossem setados para classe superior e apenas os atributos diferentes seriam setados pelas classes reais.
Não sei se fui claro :(
Opz, você tem a variável definida sim, viajei .. agora que vi na outra classe ali, posta o código da tua userFactory ..
Opa esqueci... aí está:
class Userfactory {
private static $tipoUsuario;
private static $dados= array();
static function Create($nome, $dados){
self::$tipoUsuario=$nome;
self::$dados=$dados;
switch(self::$tipoUsuario){
case "Funcionario": return new Funcionario(self::$dados);
case "Cliente": return new Cliente($nome);
default: throw new exception("Tipo de usuário não existe");
}
}
}Tenta colocar assim na sua classe 'Funcionario'.
parent::__construct($dados['nome'], $dados['email'], $dados['senha'], $dados['status'], $dados['criador']);
$teste = userfactory::Create("Funcionario", $dados);
echo '<pre>';
var_dump( $teste );
echo $teste->getNome();
ententa o retorno do var_dump();
se tiver duvidas, poste.
obs: faltou um break; no teu switch()
Cara, deu certo! Nem me toquei que não estava passando os dados corretos para o construct!!!
Obrigado
Acho que é porque você não tem a variável '_nome' definida dentro da classe, você tem apenas '_setor' declarada lá dentro, defina essa variável, e tente novamente.