Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

PHP + POO diferenciar objetos instanciados

Estas en el tema de PHP + POO diferenciar objetos instanciados en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Estimados, junto con saludar, les cuento que estoy programando un sitio en php con poo.... Mi duda salta a la vista al realizar una query ...
  #1 (permalink)  
Antiguo 08/06/2012, 11:58
Avatar de sebastianxjavier  
Fecha de Ingreso: agosto-2011
Mensajes: 23
Antigüedad: 12 años, 7 meses
Puntos: 0
PHP + POO diferenciar objetos instanciados

Estimados, junto con saludar, les cuento que estoy programando un sitio en php con poo.... Mi duda salta a la vista al realizar una query a la bd y la recorro para asi crear objetos dinamicamente con sus respectivos datos... pero luego al momento de mostrarlos, como los diferencio???

La idea es que los objetos se muestren de la forma:



Aplicando programación estructurada el código es así (Funciona Obviamente):

Código PHP:
<?php
//el metodo "listarFactura" hace la query y la retorna en la variable $documentox
$documentox $vendedor->listarFactura($nombre_cliente);
?>
//Se imprimen los registros resultantes
<table border="1" width="100%">
   <tr align="center">
    <td>N° Factura</td>
    <td>Cliente</td>
      <td>Fecha Emisión</td>
    <td>Fecha Vencimiento</td>
    <td>Monto Total</td>
    <td>Estado</td>
   </tr>
   <?php
   
while ($registro mysql_fetch_assoc($documentox))
   {
   
?>
   <tr align="center">
    <td><?php echo $registro['id_documento_pago']?></td>
    <td><?php echo $registro['cliente_id_cliente']?></td>
    <td><?php echo $registro['fecha_emision_documento_pago']?></td>
      <td><?php echo $registro['fecha_vencimiento_documento_pago']?></td>
    <td><?php echo $registro['total_documento_pago']?></td>
    <td><?php echo $registro['estado_documento_pago']?></td>
   </tr>
   <?php
   
}
   
?>
  </table>
Pero al llevarlo a objeto cambia a esto:

Código PHP:
<?php
//el metodo "listarFactura" hace la query y la retorna en la variable $documentox
$documentox $vendedor->listarFactura($nombre_cliente);
?>

/*
*se recorre la variable y se crea el objeto (solo funciona para un objeto)
*/
while ($registro = mysql_fetch_assoc($documentox))
{
     $documento = new Documento_Pago();
     $documento->setIdDocumentoPago($registro['id_documento_pago']);
     $documento->setFechaEmisionDocumentoPago($registro['fecha_emision_documento_pago']);
     $documento->setFechaVencimientoDocumentoPago($registro['fecha_vencimiento_documento_pago']);
     $documento->setTotalDocumentoPago($registro['total_documento_pago']);
     $documento->setEstadoDocumentoPago($registro['estado_documento_pago']);
}

/*
*Funciona solo para un objeto
*/
<table border="1" width="100%">
   <tr align="center">
    <td>N° Factura</td>
    <td>Cliente</td>
      <td>Fecha Emisión</td>
    <td>Fecha Vencimiento</td>
    <td>Monto Total</td>
    <td>Estado</td>
   </tr>
   <?php
   
while ($registro mysql_fetch_assoc($documentox))
   {
   
?>
   <tr align="center">
    <td><?php echo $documento->getIdDocumentoPago()?></td>
    <td><!--No se incluye en este objeto este dato--></td>
    <td><?php echo $documento->getFechaEmisionDocumentoPago()?></td>
      <td><?php echo $documento->getFechaVencimientoDocumentoPago()?></td>
    <td><?php echo$documento->getTotalDocumentoPago()?></td>
    <td><?php echo $documento->getEstadoDocumentoPago()?></td>
   </tr>
   <?php
   
}
   
?>
Ahora mis dudas... como lo hago para poder instancias dinamicas de objetos? poniendo un contador antes del while que crea y le hace set al objeto? hay una forma mas elegante???? pero lo mas importante si tengo ya creado 2 objetos de la misma clase... como los puedo diferenciar para trabajar con ellos? salu2!
  #2 (permalink)  
Antiguo 08/06/2012, 12:16
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: PHP + POO diferenciar objetos instanciados

Yo veo que el primer bucle del segundo código está de sobra, pues ahí no haces nada con el objeto, solo lo estás creando y eso no sirve de nada.

En todo caso, ¿que tan difícil es usar sólo el segundo bucle para crear e imprimir todo ahí?

Además si sólo estás imprimiendo los datos, ¿que caso tiene crear el objeto y no imprimir directamente?

No veo ninguna ventaja de lo que haces, nada. ¡Justo como el primer código!
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 08/06/2012, 12:19
Avatar de sebastianxjavier  
Fecha de Ingreso: agosto-2011
Mensajes: 23
Antigüedad: 12 años, 7 meses
Puntos: 0
Respuesta: PHP + POO diferenciar objetos instanciados

Cita:
Iniciado por pateketrueke Ver Mensaje
Yo veo que el primer bucle del segundo código está de sobra, pues ahí no haces nada con el objeto, solo lo estás creando y eso no sirve de nada.

En todo caso, ¿que tan difícil es usar sólo el segundo bucle para crear e imprimir todo ahí?

Además si sólo estás imprimiendo los datos, ¿que caso tiene crear el objeto y no imprimir directamente?

No veo ninguna ventaja de lo que haces, nada.
Creo el objeto para poder mostrarlo y trabajar con POO.. por lo otro no lo imprimo altiro porque omiti que estoy trabajando con MVC, por lo que de ahi me voy a la vista y ahi recien imprimo el objeto
  #4 (permalink)  
Antiguo 08/06/2012, 12:25
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: PHP + POO diferenciar objetos instanciados

Bien, pues entonces primero debes almacenar los objetos creados en un array, y luego iterar ese array en tu vista.
Código PHP:
$out = array();

while (
$row fetch($algo)) {
  
$doc = new Doc;
  
// ...

  
$out []= $doc;
}

// vista

foreach ($out as $doc) {
  echo 
$doc->getBar();

__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #5 (permalink)  
Antiguo 12/06/2012, 02:18
Avatar de sebastianxjavier  
Fecha de Ingreso: agosto-2011
Mensajes: 23
Antigüedad: 12 años, 7 meses
Puntos: 0
Respuesta: PHP + POO diferenciar objetos instanciados

Cita:
Iniciado por pateketrueke Ver Mensaje
Bien, pues entonces primero debes almacenar los objetos creados en un array, y luego iterar ese array en tu vista.
Código PHP:
$out = array();

while (
$row fetch($algo)) {
  
$doc = new Doc;
  
// ...

  
$out []= $doc;
}

// vista

foreach ($out as $doc) {
  echo 
$doc->getBar();


Muchas gracias compadre! me ha servido de maravilla :D!
  #6 (permalink)  
Antiguo 12/06/2012, 03:31
Avatar de oscartt67  
Fecha de Ingreso: abril-2012
Ubicación: fonollosa
Mensajes: 481
Antigüedad: 12 años
Puntos: 97
Respuesta: PHP + POO diferenciar objetos instanciados

Hola Sebastian. Queria hacerte una observación:

En lugar de crear un método GetPropiedad y un SetPropiedad para cada propiedad de la clase, puedes plantearte hacer un Get(propiedad) y un Set(propiedad,valor), y definir en la clase además un preproceso y postproceso para los casos que lo necesiten.

Saludos!
  #7 (permalink)  
Antiguo 12/06/2012, 17:07
Avatar de sebastianxjavier  
Fecha de Ingreso: agosto-2011
Mensajes: 23
Antigüedad: 12 años, 7 meses
Puntos: 0
Respuesta: PHP + POO diferenciar objetos instanciados

Cita:
Iniciado por pateketrueke Ver Mensaje
Bien, pues entonces primero debes almacenar los objetos creados en un array, y luego iterar ese array en tu vista.
Código PHP:
$out = array();

while (
$row fetch($algo)) {
  
$doc = new Doc;
  
// ...

  
$out []= $doc;
}

// vista

foreach ($out as $doc) {
  echo 
$doc->getBar();

Compadre tengo una ultima consulta : Como te mencione con anterioridad me resulto perfecto guardando el objeto en un arreglo y luego recorrerlo con foreach... pero ahora me salto un pequeño problemilla que creo que me puedes asesorar....

Código PHP:
$out1 = array();
$out2 = array();

while (
$row fetch($algo)) {
  
//1er objeto
  
$doc = new Doc();
  
//2do objeto
  
$cliente = new Cliente();
  
// ...

  
$out1 []= $doc;
  
$out2 []= $cliente;
}

// vista

foreach ($out as $doc) {
  echo 
$doc->getBar();


Como veras en la vista no modifique nada, mi pregunta es la siguiente.. como puedo hacer que imprima los objetos de documento y a su vez los del cliente asociado a ese documento, que se encuentra en otro objeto y a su vez en otro arreglo? trate de utilizarlo en el mismo arreglo pero me cambiaba el objeto con los metodos del otro xD! Atento a tus comentarios


Cita:
Iniciado por oscartt67 Ver Mensaje
Hola Sebastian. Queria hacerte una observación:

En lugar de crear un método GetPropiedad y un SetPropiedad para cada propiedad de la clase, puedes plantearte hacer un Get(propiedad) y un Set(propiedad,valor), y definir en la clase además un preproceso y postproceso para los casos que lo necesiten.

Saludos!
Se agradece el comentario y optimizare las clases... gracias
  #8 (permalink)  
Antiguo 12/06/2012, 18:09
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: PHP + POO diferenciar objetos instanciados

Podrías guardar ambos objetos en otro array, y luego listarlos.
Código PHP:
$out []= array($foo$bar);

// ...
while (list($foo$bar) = each($out)) {
  
$foo->candy();
  
$bar->does();

__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #9 (permalink)  
Antiguo 12/06/2012, 21:00
Avatar de sebastianxjavier  
Fecha de Ingreso: agosto-2011
Mensajes: 23
Antigüedad: 12 años, 7 meses
Puntos: 0
Respuesta: PHP + POO diferenciar objetos instanciados

Cita:
Iniciado por pateketrueke Ver Mensaje
Podrías guardar ambos objetos en otro array, y luego listarlos.
Código PHP:
$out []= array($foo$bar);

// ...
while (list($foo$bar) = each($out)) {
  
$foo->candy();
  
$bar->does();

pucha compadre no me resulto.... me sale este error: "Fatal error: Call to a member function getIdCliente() on a non-object in C:\wamp\www\svcb\_vista\clienteMoroso.php on line 26". En esa linea tengo el codigo "echo $cliente->getIdCliente()"

El error no me hace referencia al objeto... tengo el codigo de esta manera:

Código PHP:
$out1 = array();
$out2 = array();

while (
$registro mysql_fetch_assoc($documentox))
{
   
$cliente = new Cliente();
   
$cliente->setIdCliente($registro['id_cliente']);
   
// ...
  
$documento = new Documento_Pago();
  
$documento->setIdDocumentoPago($registro['id_documento_pago']);
  
// ...
  
$out1[] = $documento;
  
$out2[] = $cliente;
}
$gua[] = array($out1,$out2);

// vista

while (list($documento$cliente) = each($gua))
{
   echo 
$cliente->getIdCliente();
   echo 
$documento->getIdDocumentoPago();

Ojala me puedas ayudar, ya que los objetos ya me tienen mariado :(... saludos compadre
  #10 (permalink)  
Antiguo 13/06/2012, 04:55
Avatar de oscartt67  
Fecha de Ingreso: abril-2012
Ubicación: fonollosa
Mensajes: 481
Antigüedad: 12 años
Puntos: 97
Respuesta: PHP + POO diferenciar objetos instanciados

...no se localizar el error en tu código, pero teniendo en cuenta que hay el mismo num de elementos en ambos arrays, otra manera seria:
Código PHP:
$out1 = array(); 
$out2 = array(); 

while (
$registro mysql_fetch_assoc($documentox)) 

   
$cliente = new Cliente(); 
   
$cliente->setIdCliente($registro['id_cliente']); 
   
// ... 
  
$documento = new Documento_Pago(); 
  
$documento->setIdDocumentoPago($registro['id_documento_pago']); 
  
// ... 
  
$out1[] = $documento
  
$out2[] = $cliente


// vista 
for($i=0;$i<count($out1);$i++){
   echo 
$out1[i]->getIdCliente(); 
   echo 
$out2[i]->getIdDocumentoPago(); 

saludos.
  #11 (permalink)  
Antiguo 13/06/2012, 05:11
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: PHP + POO diferenciar objetos instanciados

Que tal sebastianxjavier,

No tienes una asociación entre las clases ? cual es tu lógica ?, un cliente tiene varios documentos y un documento pertenece a un cliente ?, no deberias tener algo asi:

Código PHP:
Ver original
  1. $client = new Client();
  2. $doc->setClient($client);
  3. $docs[] = $doc;
  4.  
  5. foreach($docs as $doc) {
  6.    //doc
  7.     echo $doc->getId();
  8.     echo $doc->getName();
  9.     //client
  10.     echo $doc->getClient()->getName();
  11.    //or proxy method
  12.     echo $doc->getClientName();
  13. }

Con respecto a los getters & setters, la tendencia por suerte es como lo tienes ahora, menos magia, te sugiero que lo dejes tal cual, y ten en cuenta que si haces tal modificación los IDE's o editores no van a poder hacer una correcta introspección de la clase.

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #12 (permalink)  
Antiguo 13/06/2012, 05:20
Avatar de oscartt67  
Fecha de Ingreso: abril-2012
Ubicación: fonollosa
Mensajes: 481
Antigüedad: 12 años
Puntos: 97
Respuesta: PHP + POO diferenciar objetos instanciados

Cita:
Con respecto a los getters & setters, la tendencia por suerte es como lo tienes ahora, menos magia, te sugiero que lo dejes tal cual, y ten en cuenta que si haces tal modificación los IDE's o editores no van a poder hacer una correcta introspección de la clase.
Es cierto que limita a los editores, pero definiendo una sola clase de datos CRUD y extendiéndola, solucionas todas las clases que se relacionan con la db de tu web. La otra opción, es escribir gets y sets de todos los campos de todas las tablas.

Saludos.
  #13 (permalink)  
Antiguo 15/06/2012, 08:36
Avatar de sebastianxjavier  
Fecha de Ingreso: agosto-2011
Mensajes: 23
Antigüedad: 12 años, 7 meses
Puntos: 0
Respuesta: PHP + POO diferenciar objetos instanciados

Cita:
Iniciado por oscartt67 Ver Mensaje
...no se localizar el error en tu código, pero teniendo en cuenta que hay el mismo num de elementos en ambos arrays, otra manera seria:
Código PHP:
$out1 = array(); 
$out2 = array(); 

while (
$registro mysql_fetch_assoc($documentox)) 

   
$cliente = new Cliente(); 
   
$cliente->setIdCliente($registro['id_cliente']); 
   
// ... 
  
$documento = new Documento_Pago(); 
  
$documento->setIdDocumentoPago($registro['id_documento_pago']); 
  
// ... 
  
$out1[] = $documento
  
$out2[] = $cliente


// vista 
for($i=0;$i<count($out1);$i++){
   echo 
$out1[i]->getIdCliente(); 
   echo 
$out2[i]->getIdDocumentoPago(); 

saludos.
Muchas gracias compadre... asi mismo me ha funcionado :).. lo raro es que me quedare con la duda de porque no me sirvio pasar los array a una lista.. pero bueno.. funciona que es lo importante... te pasaste! salu2!

Cita:
Iniciado por masterpuppet Ver Mensaje
Que tal sebastianxjavier,

No tienes una asociación entre las clases ? cual es tu lógica ?, un cliente tiene varios documentos y un documento pertenece a un cliente ?, no deberias tener algo asi:

Código PHP:
Ver original
  1. $client = new Client();
  2. $doc->setClient($client);
  3. $docs[] = $doc;
  4.  
  5. foreach($docs as $doc) {
  6.    //doc
  7.     echo $doc->getId();
  8.     echo $doc->getName();
  9.     //client
  10.     echo $doc->getClient()->getName();
  11.    //or proxy method
  12.     echo $doc->getClientName();
  13. }

Con respecto a los getters & setters, la tendencia por suerte es como lo tienes ahora, menos magia, te sugiero que lo dejes tal cual, y ten en cuenta que si haces tal modificación los IDE's o editores no van a poder hacer una correcta introspección de la clase.

Saludos.

Bueno, básicamente como se trabaja en objetos, el id del cliente y los atributos que siguen de él solo pertenecen a la clase cliente que hereda de persona, por lo cual no son atributos de la clase documento, por lo que es esa la razón para no haber puesto los datos del cliente en esta ultima clase, pero obviamente se ve reflejado en el modelo físico de datos con la asociación pertinente 1->n. Saludos y gracias
  #14 (permalink)  
Antiguo 15/06/2012, 10:21
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: PHP + POO diferenciar objetos instanciados

Desde el momento que el documento tiene la clave foránea de cliente a nivel de domain model existe la asociación, luego te toca a ti decidir si es uni o bidireccional y en el ejemplo que muestras es mas que claro que tiene que ser bidireccional..., tu clase documento debería tener como propiedad un cliente y el cliente como propiedad una colección de documentos, es un one-to-many clásico, te sugiero que revises tu domain model.

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)

Etiquetas: estructurado, instanciar, php, poo, setiar
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:37.