Programação Especialista

Artigos de Programação em Geral

Agrupar propriedades de várias classes

, , , , ,

Esses dias precisei fazer uma coisa realmente interessante e vou compartilhar aqui no blog!
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!!

Criando um webservice para outras pessoas acessarem via programaçãoHerança de classes no PHP

Comments

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

Anonymous writes: mandou bem... tava instanciando uma tuia de classe para transpor da classe DAO para a VO ;D

Write a comment

New comments have been disabled for this post.