Ir para conteúdo

POWERED BY:

Arquivado

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

gguimaraes

Orientação a Objetos e Banco de dados

Recommended Posts

Galera,

 

estou refazendo um sistema que tenho e gostaria fazer tudo orientado a objetos. Já no começo, surgiu uma dúvida. Como fazer para recuperar as informações de um objeto que estão armazenado em banco?

 

Bom, antes que alguém diga que no fórum existem várias tópicos sobre isso, gostaria de dizer que os tópicos que achei sobre este assunto não respondem a minha dúvida (especificamente).

 

Deixa eu detalhar um pouco.

 

Por exemplo, existe uma classe pai que chamaremos de BIBLIOTECA e uma classe filho que chamaremos de LIVRO. Na classe BIBLIOTECA, existem informações de nome, endereço e telefone. Na classe LIVRO tem informações de título, autor e assunto.

 

Existe uma tabela no banco para BIBLIOTECA e outra para LIVRO. Como a classe LIVRO extende a classe BIBLIOTECA, então acredito que deve existir um indentificador pra saber quem é o pai (isso no banco de dados). Então poderia ser criado um campo na tabela LIVRO que seria a chave estrangeira (ID, por exemplo).

 

Agora vamos ao código PHP. Digamos que eu gostaria de pegar todas as informações de um objeto LIVRO (desde os atributos título, autor e assunto quanto os atributos que ele herdou da classe BIBLIOTECA).

 

Minha pergunta é como fazer isso??

 

Uma primeira idéia seria criar uma consulta com INNER JOIN para as duas tabelas do banco, mas acho que isso não estaria fazendo parte do conceito de orientação a objetos. Qual seria a maneira de fazer isso.

 

Será que alguém poderia postar um código simples como exemplo?

 

Agradeço desde já!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, não entendi direito, mas acho que o que você esta tentando fazer é o chamado "encapsulamento de objetos" seria isso ?

 

o resultado seria um array contendo varios objetos, por exemplo:

 

$array[0] = (objeto com os dados dele)

$array[1] = (objeto com os dados dele)

 

e assim ... "sucessivamente", como diz meu professor.

 

 

então, pra fazer isso o jeito é primeiramente criar um arquivo com uma classe a qual vamos chamar classe Entidade, ok ?

nela vão existir apenas variaveis e as funções Set e Get pra cada variavel, onde Set vai servir para setar a variavel e Get para pega-la.

 

se você estiver utilizando PHP 5.0, você deve colocar todas as variaveis como sendo private, como no exemplo a seguir:

 

<?class entidade{private $id_usuario;private $nome_usuario;private $senha_usuario;// Sets da funçãopublic function SetIdUsuario($var){ $this->id_usuario = $var;}public function SetNomeUsuario($var){ $this->nome_usuario = $var;}public function SetSenhaUsuario($var){ $this->senha_usuario = $var;}// Gets da funçãopublic function GetIdUsuario(){ return $this->id_usuario;}public function GetNomeUsuario(){ return $this->nome_usuario;}public function GetSenhaUsuario(){ return $this->senha_usuario;}}?>

Bleza? isso aí é simples, não tem mistério algum.

Agora la na programação dos usuarios, fariamos algo assim:

 

<?

$sql = mysql_query("

SELECT usuarios.* FROM usuarios

WHERE 1

");

 

foreach ($objResult as mysql_fetch_object($sql)){

$entidade = new entidade;

 

$entidade->setIdUsuario($objResult->idusuario);

$entidade->setNomeUsuario($objResult->nomeusuario);

$entidade->setSenhaUsuario($objResult->senhausuario);

 

$lista[] = $entidade;

}

 

return $entidade; // retornaria um array com os objetos prontos :)

?>

 

 

acho que é isso, escrevi tudo na mão por isso esta meio feio e possivelmente com bugs =x

 

mas a idéia é essa, espero que seja isso que você. quer . . . =/

Compartilhar este post


Link para o post
Compartilhar em outros sites

E aê nolfolk, tudo beleza?Cara, valeu pela ajuda. Entendi este exemplo que você criou.Mas em relação ao classes que são filhas? Quando você cria uma classe filha, ela herda os atributos da classe pai, certo?O que eu imaginei como um modelo de arquivos e de banco de dados seria um arquivo para a classe pai e um pra classe filho. No banco de dados, uma tabela pra pai e uma pra filho.Eu gostaria de saber como pegar no banco de dados todos os atributos do filho (tanto os que ele herdo quanto os seus próprios). Minha dúvida é como criar um objeto e pegar todos os atributos.Acho que é isso... Se ficar mais alguma dúvida, fala aí que eu tento explicar de outra maneira.Valeu pela ajuda!

Compartilhar este post


Link para o post
Compartilhar em outros sites

cara, ta mais me parecendo uma dúvida sobre SELECTS do que dúvida de orientação a objetos.Não tem segredo, oque eu posso lhe dizer, é que assim que você instanciar uma classe filha e a classe pai tiver um construtor, você uma um parent::__construct(); dentro do construtor da classe filha E outra ... da uma olhada nessa modelagem ae ... tem certeza que um objeto chamado biblioteca é pai de um objeto chamado livro ...tem alguma coisa de errado ae neahhh ...Digo isso, pq se for algum sistema bibliotecário, a classe biblioteca poderia servir como um objeto Lista de Livros ... então não vejo muita lógica em deixar a classe biblioteca como pai .... ´Só uma opnião só .... qq coisa posta ae

Compartilhar este post


Link para o post
Compartilhar em outros sites

E aê Void, tudo beleza?

 

Esse exemplo da biblioteca foi só um exemplo mesmo. Não precisa ser necessariamente isso.

 

A minha dúvida é em relação ao acesso de uma classe pai e uma classe filha. Deixa ver se consigo explicar melhor.

 

Ontem estava lendo sobre este exemplo que você colocou. Mas, se não me engano, a classe filha só pode acessar uma classe pai.

 

Então, seguindo seu exemplo, como eu poderia fazer pra acessar as propriedades da "classe1" (que é a classe pai) através de uma "classe3" (que é subclasse da "classe2" que é subclasse da "classe1")??

 

Não sei se estou falando certo estes conceitos de classe pai (ou superclasse) e classe filha (ou subclasse). Qualquer coisa alguém me corrige.

 

Valeu pela ajuda!! http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

 

PS: só pra resaltar mais ainda, ache que a grande dúvida é sobre padrões de projeto, ou seja, qual seria a melhor maneira de montar o código.

Compartilhar este post


Link para o post
Compartilhar em outros sites

ah cara .. agora eu acho que saquei a sua dúvida

vamos la ... ve se é isso

tendo uma classe Filha Professor

tendo uma classe Pai Funcionarios

como eu faço para acessar as propriedades e métodos da classe Funcionarios ?

Acertei !?

 

Se sim, vamos a resposta:

Sempre que houver herança entre classes, todos os métodos declarados como protected ou public são heradados pela classe filha, Então nós teriamos na prática:

 

<?phpclass Funcionarios{private $id;protected $nome;public $Endereco;public function __construct($id, $nome, $endereco){	$this->Endereco = $endereco;	$this->nome = $nome;	$this->id = $id;}}class Professor extends Funcionarios {protected $QtAulas;public function __construct ($id, $nome, $endereco){	parent::__construct($id, $nome, $endereco);	$this->QtAulas = '';}public function getNome(){	return $this->nome;}}//Fazendo os devidos testes$Prof = new Professor (1,'Astolfo','R. Botelho Pinto, nº 23');print $Prof->getNome();print $Prof->Endereco; //herdado pois é public/*daqui pra baixo, retorna erroprint $Prof->nome; // o valor é herdado, mas a forma que eu estou tentando acessar é incorretaprint $Prof->id; // não herdado pois é private*/?>
Sacou !!??

Compartilhar este post


Link para o post
Compartilhar em outros sites

esse negócio de uma classe ser pai ou não você deve tomar mto cuidado, pq isso aih é HERANÇA!!!para pegar um select faz assim$mySQL = new MySQL();$rows = mysql_fetch_assoc($mySQL->sql("SELECT * from livros"))aqui ta funcionando assim na moralquer dizer soh naum cunsigo dar um next($rows) num sei pq

Compartilhar este post


Link para o post
Compartilhar em outros sites

Void, é isso mesmo que eu tô querendo! Estamos quase chegando lá.

 

Só tem uns pequenos detalhes que ainda tenho dúvida.

 

Primeiro é que eu preciso pegar os dados do banco. Pra isso, minha idéia é criar uma tabela pra cada classe onde os campos seriam os atributos das classes. Acho que esta seria a melhor maneira de fazer.

 

Agora vou criar um exemplo (seguindo o modelo do seu) para detalhar mais o que preciso.

 

Digamos que abaixo sejam as tabelas do banco de dados: <b>Funcionario</b>

- id (chave primária)

- nome

- endereco

 

<b>Professor</b>

- id (chave primária)

- qtde

- id_funcionario (chave estrangeira da tabela Funcionario)

 

Agora voltando ao seu exemplo. Para retornar um dado, eu uso a função <b>getNome</b>. Eu não gostaria de especificar todos os atributos (campos) no construtor. Ao invés disso, gostaria que, assim que chamasse um objeto da classe Professor, ele associaria com a chave estrangeira da tabela de funcionários e retornasse os dados de Funcionário referente.

 

Compliquei muito ou tá fácil de entender?

 

Vê se consegue me ajudar com isso....

 

Valeu seu apoio!! http://forum.imasters.com.br/public/style_emoticons/default/joia.gif

 

Até mais.......

 

 

------------------------------------//--------------------------------------

 

 

E aê Suissa, tudo beleza?

 

Cara, não entendi direito o que você tentou mostrar no seu exemplo, mas acho que é essa a idéia, pois estou trabalhando com herança.

 

Tem como você explicar de outra maneira? Talvez montando uma pequena classe...

 

Valeu a ajuda.

Compartilhar este post


Link para o post
Compartilhar em outros sites

fala ferinha.

Então, sobre a súa duvida de criar tabelas de acordo com seus objetos, voce tem que ver até que ponto isto é viável.

Eu por exemplo, não gosto muito de modelar meu banco de acordo com os objetos que foram/serão encontrados.

Eu acho que antes de modelar as classes,o interessante é modelar o banco.

Porque veja bem, ainda usando o mesmo exemplo da classe funcionarios e professores, você pode se deparar com a seguinte modelagem de banco:

TBFUNCIONARIOSIDNomeIDCargo //references TBCargo (IDCargo)TBCargo //Aqui voce define se ele é professor ou nãoIDCargoDescricaoCargo

I ai? ... tu vai ter que mudar toda a modelagem do banco só para se adaptar as suas classes ... pode ser que isso só venha complicar ao invés de facilitar.

 

Bom, sobre sua colocação, eu acho que saquei oque você quer fazer.

Voce quer instanciar um objeto da classe Funcionario e de acordo com o id do Funcionario instanciado, o objeto automaticamene ja se tornaria um objeto da classe professor devido ao relacionamento. certu !?

 

Se sim, vou deixar voce pensar um pouco.

Se não, poste novamente ...

 

vemm cummigu!

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, sobre sua colocação, eu acho que saquei oque você quer fazer.Voce quer instanciar um objeto da classe Funcionario e de acordo com o id do Funcionario instanciado, o objeto automaticamene ja se tornaria um objeto da classe professor devido ao relacionamento. certu !?

É quase isso.A minha idéia de criação de classe é pra manipular os registros que tenho no banco de dados.Lembra deste exemplo,- Classe pai: Funcionarios- Classe Filha: ProfessorPois é, aplique isso ao exemplo que você colocou no último post. Vou tentar colocar o SLQ (se tiver errado, liga não que tô fazendo de cabeça).CREATE TABLE funcionario(id INT(11) NOT NULL AUTO_INCREMENT,nome VARCHAR(50),endereco VARCHAR(50),PRIMARY KEY(id));CREATE TABLE professor(id INT(11) NOT NULL AUTO_INCREMENT,qtde INT(11),PRIMARY KEY(id),CONSTRAINT fk_id_funcionario FOREIGN KEY (id_funcionario)REFERENCES funcionario(id));Aproveito até pra tirar uma dúvida: é assim que define uma chave estrangeira em uma tabela ou não precisa, só na hora de fazer uma consulta fazer um INNER JOIN???O que eu quero fazer é o contrário do que você disse. Quero criar um objeto da classe professor (que na verdade vai ser um registro da tabela) e, a partir daí, pegar os atributos do professor que são herdados da classe funcionario (e que estão na tabela funcionario). Isso é possível porque posso relacionar o que é filho com o que é pai através de um atributo (id_funcionario, que está na tabela professor).Quando eu disse que é o contrário é porque se você tem um pai, não dá pra saber qual o filho que está referenciando (já que ele pode ter vários). Mas no caso do filho, você pode saber quem é o pai (só tem um).Não sei se desta maneira que expliquei é possível entender.Qualquer coisa, só avisar.Não desiste me mim..... hahahaha... http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

que isso nego, aqui ainda bate um coração de modera !!! ehheheh

 

Eu saquei sim oque voce disse, eu vou responder em tópicos para facilitar a explicação e o entendimento

vamos la:

 

É quase isso.

 

A minha idéia de criação de classe é pra manipular os registros que tenho no banco de dados.

 

Lembra deste exemplo,

- Classe pai: Funcionarios

- Classe Filha: Professor

 

Pois é, aplique isso ao exemplo que você colocou no último post. Vou tentar colocar o SLQ (se tiver errado, liga não que tô fazendo de cabeça).

 

CREATE TABLE funcionario(

id INT(11) NOT NULL AUTO_INCREMENT,

nome VARCHAR(50),

endereco VARCHAR(50),

PRIMARY KEY(id)

);

 

CREATE TABLE professor(

id INT(11) NOT NULL AUTO_INCREMENT,

qtde INT(11),

PRIMARY KEY(id),

CONSTRAINT fk_id_funcionario FOREIGN KEY (id_funcionario)

REFERENCES funcionario(id)

);

Essa query esta 90% correta, faltou um:

 

CREATE TABLE professor(

id INT(11) NOT NULL AUTO_INCREMENT,

qtde INT(11),

PRIMARY KEY(id),

id_funcionario INT(11),

CONSTRAINT fk_id_funcionario FOREIGN KEY (id_funcionario)

REFERENCES funcionario(id)

);

 

mas isso não vem ao caso :D

 

Aproveito até pra tirar uma dúvida: é assim que define uma chave estrangeira em uma tabela ou não precisa, só na hora de fazer uma consulta fazer um INNER JOIN???

É marromeno assim, ta no caminho, mas se a tabela for do tipo MyISAM acho que não rola dependencias, com tabelas do tipo INNODB rola com certeza.

 

Sobre os joins, ai ja é outra história, você consegue fazer uma consulta com join sem relacionamento (FK) entre as tabelas ...

 

O que eu quero fazer é o contrário do que você disse. Quero criar um objeto da classe professor (que na verdade vai ser um registro da tabela) e, a partir daí, pegar os atributos do professor que são herdados da classe funcionario (e que estão na tabela funcionario). Isso é possível porque posso relacionar o que é filho com o que é pai através de um atributo (id_funcionario, que está na tabela professor).

Sim, sim, é possivel, como eu lhe disse, voce tera uma classe professor certo !?

então vamos ao code :

$sqlProfessor = mysqli_query("SELECT funcionario.ID as idfunc, professor.ID as idprof, Nome, Endereco, QtdeAulasDia FROM  funcionario INNER JOIN professor ON funcionario.id = professor.id_funcionario ORDER BY nome");while ($row = mysqli_fetch_assoc($sqlProfessor)) {	$Professor[] = new Professor($row['idprof'], $row['idfunc'], $row['Nome'], $row['Endereco'],$row['QtdeAulasDia']);}
Beleza, temos uma lista de professores, bom, você viu que eu adicionei 2 parametros a mais no construtor da classe filha, a classe pai (Funcionario) continua a mesma coisa, saca só como ficou o construtor da classe:

class Professor extends Funcionario { private $qtAulas; private $idprof; public function __construct ($idprof, $idfunc, $nome, $end, $qtAulas) {	parent::__construct($idfunc, $nome, $end);	$this->idprof = $idprof;	$this->qtAulas = $qtAulas; } public function getNome(){   return $this->Nome;}public function getEnd(){   return $this->Endereco;}}
Assim, se eu quiser acessar os métodos nome, end eu consigo normalmente através da classe Professor, só usar os devidos getters

vamos ao próximo tópico :

 

Quando eu disse que é o contrário é porque se você tem um pai, não dá pra saber qual o filho que está referenciando (já que ele pode ter vários). Mas no caso do filho, você pode saber quem é o pai (só tem um).

sim sim. Isso mesmo velinho, pelo visto, o conceito de OO voce possui :D isso facilita :D

 

Não sei se desta maneira que expliquei é possível entender.

 

Qualquer coisa, só avisar.

 

Não desiste me mim..... hahahaha... http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

é nois !

Compartilhar este post


Link para o post
Compartilhar em outros sites

Void,

 

tudo beleza? Cara, entendi tudo. Vou ter um pouquinho de trabalho pra implementar tudo mas acho que vai dar certo.

 

Valeu pela ajuda!!! http://forum.imasters.com.br/public/style_emoticons/default/joia.gif http://forum.imasters.com.br/public/style_emoticons/default/clap.gif

 

 

Eu vou dar mais uma estudada por aqui e se achar alguma coisa que facilita, coloco o resultado por aqui.

 

 

A minha dificuldade vai ser o que eu suspeitava: implementar o SELECT das classes filhas (no sistema que estou montando existe uma herança de 5 classes, uma filha da outra.

 

Uma vez li que não era possível ter uma classe "neta" em PHP, mas com os testes que fiz aqui deu tudo certo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

sim é possivel ter uma classe "neta" (ótima essa analogia ... ehehehe)tentei ser o mais explicito o possivel, mas qq coisa é só postar filho

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.