Agrupar propriedades de várias classes
Wednesday, January 7, 2009 3:02:13 PM
Precisei agrupar todas as propriedades de 3 classes para passar pra uma para uma função que enviava um e-mail para o cliente com todos seus dados, e para evitar ter q ficar pegando id e instanciando N objetos em tempo de envio de email para compor o email, resolvi criar esta função que eu agrupo todas as propriedades em uma classe ja tratada do jeito que deve ser feito e utilizo os dados ja prontos no objeto.
Claro que para funcionar corretamente deve ter uma nomenclatura de banco de dados bem feita pois se em duas classes tiver a propriedade nome, elas irão se sobrescrever, então o correto é colocar a propriedade no tipo : nome_cliente, nome_pedido e assim por diante.
Supondo que as classes eram NF , PEDIDO , CLIENTE, utilizaremos uma instância da classe stdClass que é uma classe base, porém como o PHP não implementa uma boa teoria de OOP, os objetos não sao diretamente derivadas dela. Nesta classe pode ser adicionada várias propriedades dinamicamente, porém não é possivel adicionar métodos.
Nota: Adição de propriedades pode ser feita em tempo de execução em qualquer classe, porém a stdClass é genérica, então fica mais facil de trabalhar com ela do que pegar a classe CLIENTE por exemplo e colocar o resto das propriedades nela, fazendo isso ela perde a característica "CLIENTE".
Seguindo as classes:
NF
<?php
class nf {
public $id_nf;
public $num_nf;
public $id_pedido;
}
?>
PEDIDO
<?php
class pedido {
public $id_pedido;
public $num_pedido;
public $id_cliente;
public $valor_pedido;
public $_itens = array();
}
?>
CLIENTE
<?php
class pessoa {
public $id_pessoa;
public $nome_pessoa;
public $email_pessoa;
public $cep;
}
?>
Pegando nossa classe commons, adicionaremos um método estático para fazer essa junção entre as classes chamada mergeObject.
commons:
<?php
class commons{
function prepare($sql){
return mysql_real_escape_string($sql);
}
function dateDiff($dateIni,$dateEnd)
{
$di1 = strtotime($dateIni);
$di = mktime(0,0,0,date('m',$di1),date('d',$di1),date('Y',$di1));
$df1 = strtotime($dateEnd);
$df = mktime(0,0,0,date('m',$df1),date('d',$df1),date('Y',$df1));
$dias_totais = floor(($df-$di)/86400);
return $dias_totais+1;
}
static function mergeObject($objs,&$recebedor){
if(count($objs) > 0 ){
foreach($objs as $ob){
$props = get_class_vars(get_class($ob));
foreach($props as $ind=>$val){
$recebedor->$ind = $ob->$ind;
}
}
}
}
}
?>
Utilizando nossa classe commons será possível juntar as três classes em uma única classe com todas as suas propriedades para serem usadas de acordo com a sua necessidade.
Utilizando o código corretamente, o resultado sera assim:
<?php
include('nf.class.php');
include('pedido.class.php');
include('pessoa.class.php');
include('commons.php');
// Inlcuindo uma pessoa fictícia
$pessoa = new pessoa();
$pessoa->id_pessoa = '1';
$pessoa->nome_pessoa = 'Marcus Brasizza';
$pessoa->email_pessoa = 'meu@email.com';
$pessoa->cep = '09090-330';
// Incluindo um pedido
$pedido = new pedido();
$pedido->id_pedido = '10';
$pedido->num_pedido = '293383';
$pedido->id_cliente = $pessoa->id_pessoa;
$pedido->valor_pedido = '700.30';
$pedido->_itens = array(2,10,30,30,20,10,65,2,7);
// incluindo uma NF
$nf = new nf();
$nf->id_nf = '12';
$nf->num_nf = '5584239';
$nf->id_pedido = $pedido->id_pedido;
commons::mergeObject(array($pessoa,$pedido,$nf),$merged = new stdClass);
?>
o resultado do objeto $merged será:
stdClass Object
(
[id_pessoa] => 1
[nome_pessoa] => Marcus Brasizza
[email_pessoa] => meu@email.com
[cep] => 09090-330
[id_pedido] => 10
[num_pedido] => 293383
[id_cliente] => 1
[valor_pedido] => 700.30
[_itens] => Array
(
[0] => 2
[1] => 10
[2] => 30
[3] => 30
[4] => 20
[5] => 10
[6] => 65
[7] => 2
[8] => 7
)
[id_nf] => 12
[num_nf] => 5584239
)
Espero que seja de grande ajuda para alguém, pra mim foi de extrema ajuda quando desenvolvi este script, pois assim posso passar o objeto inteiro para o MVC Smarty sem precisar instanciar uma pancada de objetos
Abraços!!












Unregistered user # Monday, March 29, 2010 11:57:26 PM