Anda di halaman 1dari 7

Mapeamento objeto relacional VO em PHP

Veja neste artigo como mapear uma tabela (Mapeamento objeto-relacional) do banco dados com PHP, ou seja, como criar um VO (Value Objects) - representao de uma entidade de negcios em PHP. por Gregory Monteiro

Nesse artigo vou mostrar como mapear uma tabela do banco dados com php, ou seja, vamos criar um VO (Value Object) em PHP. O propsito de um VO (Value Object) de representar uma entidade de negcios. Um VO uma classe de mapeamento de dados que espelha a entidade que existe no banco de dados. Um VO mais complexo pode incorporar outras funcionalidades em seus mtodos. Por exemplo, um VO pode ter um mtodo que transforma seus dados em um n XML ou um VO pode ser capaz de ler seus dados a partir de um HTML. A nica coisa que o VO no tem que se preocupar o banco de dados. A finalidade principal do VO armazenar os dados que entram e sai da base de dados. Nesse exemplo estou usando o banco de dados MySQL. Vamos primeiramente criar um banco de dados chamado teste. Ver Listagem 1 Listagem 1: Cdigo para criar um banco de dados no MySQL query 1create database teste Em seguida vamos criar uma tabela que ser usada no nosso mapeamento. O nome da nossa tabela ser usuarios. Essa tabela ter um id e os campos nome, login e senha. Ver Listagem 2. Listagem 2: Cdigo para criar a tabela usuarios no MySQL query 1CREATE TABLE teste.usuarios ( 2 id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, 3 nome VARCHAR(45) NOT NULL, 4 login VARCHAR(45) NOT NULL, 5 senha VARCHAR(45) NOT NULL ) 6 Vamos inserir uns valores na tabela de usurios para podermos testar a classe que iremos criar. Ver Listagem 3. Listagem 3: Inserindo dados na tabela Usuarios
INTO teste.usuarios (nome,login,senha) 1INSERT VALUES('nome1','login1','senha1'); 2INSERT INTO teste.usuarios (nome,login,senha)

3VALUES('nome2','login2','senha2'); 4INSERT INTO teste.usuarios (nome,login,senha)


VALUES('nome3','login3','senha3'); INSERT INTO teste.usuarios (nome,login,senha) VALUES('nome4','login4','senha4');

Agora vamos criar a estrutura da classe que ir mapear essa tabela de usuarios. Para isso vamos criar um arquivo chamado usuariosVO.php e criar a nossa classe usuariosVO. Ver Listagem 4. Listagem 4: Estrutura da classe usuariosVO 1<?php 2class usuariosVO{ 3} 4?> Vamos ento adicionar os mtodos padres para as classes de mapeamento, que so o __construct, __clone e __destruct. Ver Listagem 5. Os mtodos __construct e __destruct.so padres do php e so responsveis por construir e destruir a instancia da nossa classe. O mtodo __clone evita que nossa classe seja clonada. Saiba mais sobre esses mtodos nos links http://www.php.net/manual/pt_BR/language.oop5.decon.php e http://www.php.net/manual/pt_BR/language.oop5.cloning.php. Listagem 5: Classe usuarios com os mtodos __construct, __clone e __destruct 1 2 <?php 3 class usuariosVO{ 4 /*Mtodo construtor da classe*/ public function __construct(){} 5 6 /*Evita que a classe seja clonada*/ 7 private function __clone(){} 8 9 /*Mtodo destrutor da classe*/ 10 public function __destruct() { 11 foreach ($this as $key => $value) { unset($this->$key); 12 } 13 foreach(array_keys(get_defined_vars()) as $var) { 14 unset(${"$var"}); 15 } unset($var); 16 } 17 18} ?> 19 20

Na Listagem 5 o mtodo __destruct remove da memria todas as variveis que foram definidas pela nossa classe. Agora vamos criar as variveis privadas que recebero os valores da nossa tabela usuarios junto com seus mtodos get e set, terminando assim a nossa classe de mapeamento de objeto relacional ou VO. Ver Listagem 6. Listagem 6: Classe usuarios com os mtodos get e set e as variveis privadas 1 class usuariosVO{ 2 /*Mtodo construtor da classe*/ public function __construct(){} 3 4 /*Evita que a classe seja clonada*/ 5 private function __clone(){} 6 7 /*Mtodo destrutor da classe*/ 8 public function __destruct() { 9 foreach ($this as $key => $value) { unset($this->$key); 10 } 11 foreach(array_keys(get_defined_vars()) as $var) { 12 unset(${"$var"}); 13 } 14 unset($var); } 15 16 /*Variveis privadas que recebero os dados*/ 17 private $id = 0; 18 private $nome = ""; 19 private $login = ""; 20 private $senha = ""; 21 /*Metodos get e set que trazem o conteudo da varivel privada 22 desejada*/ 23 public function getId(){ 24 return $this->id; 25 } public function setId($id){ 26 $this->id = intval($id); 27 } 28 29 public function getNome(){ 30 return $this->nome; 31 } public function setNome($nome){ 32 $this->nome = $nome; 33 } 34 35 public function getLogin(){ 36 return $this->login; 37 } public function setLogin($login){ 38 $this->login = $login; 39 } 40 41 public function getSenha(){
<?php

42 43 44 45 46} 47?> 48 49 50 51 52 53 54 55

return $this->senha; } public function setSenha($senha){ $this->senha = $senha; }

Vamos ver uma aplicao prtica de como usar a classe usuariosVO. Obs.: como o objetivo desse exemplo mostrar como usar os mtodos da classe que criamos, no vou me ater ao desenvolvimento de um Data Acess Object (DAO) e de uma classe para conectar no banco de dados. Veja esses artigos para saber mais sobre um Data Acess Object (DAO) e uma classe de conexo com o banco de dados: Trabalhando com Data Access Object (DAO) em PHP e PDO em PHP Orientado a Objetos. Na Listagem 7 vemos como usar a classe usuariosVO para receber os dados da tabela usuarios. Nesta listagem fiz um simples exemplo de como usar o PDO para retornar os dados de um registro da tabela. Estou usando o mtodo fetchAll (http://php.net/manual/pt_BR/pdostatement.fetchall.php) para retornar os dados em forma de objetos e, aps isso setando, esses dados na classe de mapeamento atravs dos mtodos set que criamos. Por fim, uso os mtodos get para retornar esses dados e mostr-los na tela. Listagem 7: Cdigo de exemplo para testar a classe usuariosVO retornando um registro apenas 1 <?php 2 class ClassAutoloader{ public function __construct(){ 3 spl_autoload_register(array($this, 'loader')); 4 } 5 private function loader($className){ include_once $className . '.php'; 6 } 7 } 8 $autoloader = new ClassAutoloader(); 9 10try 11{

/*tentando se conectar ao banco de dados MySQL*/ 12 $conexao = new PDO("mysql:host=localhost;port=3306;dbname=teste", 13 "root", "123"); 14} 15catch (PDOException $i) 16{ /*se houver exceo, exibe*/ 17 die("Erro: <code>" . $i->getMessage() . "</code>"); 18} 19 20$sql = "SELECT * FROM usuarios WHERE id = ?"; 21$params = array(1); 22 23$query=$conexao->prepare($sql); 24$query->execute($params); $rs = $query->fetchAll(PDO::FETCH_OBJ) or die(print_r($query25>errorInfo(), true)); 26 27/*instancia da classe usuariosVO*/ 28$usuariosVO = new usuariosVO(); 29 30/*usando os mtodos set da classe usuariosVO*/ 31$usuariosVO->setId($rs[0]->id); $usuariosVO->setNome($rs[0]->nome); 32$usuariosVO->setLogin($rs[0]->login); 33$usuariosVO->setSenha($rs[0]->senha); 34 35/*usando os mtodos get da classe usuariosVO*/ 36echo $usuariosVO->getId() . "<br>\n"; echo $usuariosVO->getNome() . "<br>\n"; 37echo $usuariosVO->getLogin() . "<br>\n"; 38echo $usuariosVO->getSenha() . "<br>\n"; 39 40$conexao = null; 41?> 42 43 44 45 46

Como vemos na Listagem 7, estou usando a classe ClassAutoloader para chamar automaticamente as classes que sero usadas no exemplo. Essa classe usa a funo spl_autoload_register implementada no PHP 5.1.2. Para saber mais acesse http://www.php.net/manual/pt_BR/function.spl-autoload-register.php. Veja o resultado na Figura 1.

Figura 1: Dados do exemplo para testar a classe usuariosVO retornando um registro apenas Na Listagem 8 modifiquei o exemplo fazendo o mtodo fetchAl associar automaticamente os registros da tabela usuarios a classe usuariosVO. Por fim fao um loop com os mtodos get para retornar esses dados e mostr-los na tela. Listagem 8: Cdigo de exemplo para testar a classe usuariosVO retornando todos os registros da tabela 1 <?php 2 class ClassAutoloader{ public function __construct(){ 3 spl_autoload_register(array($this, 'loader')); 4 } 5 private function loader($className){ include_once $className . '.php'; 6 } 7 } 8 $autoloader = new ClassAutoloader(); 9 10try 11{ /*tentando se conectar ao banco de dados MySQL*/ 12 $conexao = new PDO("mysql:host=localhost;port=3306;dbname=teste", 13"root", "123"); 14} 15catch (PDOException $i) 16{ /*se houver exceo, exibe*/ 17 die("Erro: <code>" . $i->getMessage() . "</code>"); 18} 19 20$sql = "SELECT * FROM usuarios"; 21 22$query=$conexao->prepare($sql); 23$query->execute(); 24$rs = $query->fetchAll(PDO::FETCH_CLASS,"usuariosVO") or die(print_r($query->errorInfo(), true)); 25 26foreach ($rs as $key => $row){ 27 /*usando os mtodos get da classe usuariosVO*/ echo $row->getId() . "<br>\n"; 28

echo 29 echo 30 echo 31} 32 33$conexao 34?> 35 36 37 38

$row->getNome() . "<br>\n"; $row->getLogin() . "<br>\n"; $row->getSenha() . "<br><br>\n\n";

= null;

Veja o resultado na Figura 2.

Figura 2: Dados do exemplo para testar a classe usuariosVO retornando todos os registros da tabela Fico por aqui e bons cdigos.

Read more: http://www.linhadecodigo.com.br/artigo/3476/mapeamento-objetorelacional-vo-em-php.aspx#ixzz2og2l55ui