Ir para conteúdo

POWERED BY:

Arquivado

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

Juliano amadeu

[Resolvido] Factory e herança

Recommended Posts

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()
       ...
//SET

//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!

Compartilhar este post


Link para o post
Compartilhar em outros sites

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 :(

Compartilhar este post


Link para o post
Compartilhar em outros sites

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");
	}
}
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

$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()

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.