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

Que pasa en el Ambiente ?

Estas en el tema de Que pasa en el Ambiente ? en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Hola, bueno, tengo una bola de confusion en la cabeza y agradeceria algun alma con paciencia que me ayude a aclarar el panorama, tratare de ...
  #1 (permalink)  
Antiguo 15/09/2007, 16:29
 
Fecha de Ingreso: septiembre-2007
Mensajes: 5
Antigüedad: 16 años, 7 meses
Puntos: 0
Que pasa en el Ambiente ?

Hola, bueno, tengo una bola de confusion en la cabeza y agradeceria algun alma con paciencia que me ayude a aclarar el panorama, tratare de ser claro...

Estamos diseñando un sistema en PHP con POO junto a una programadora que viene de Java, y no terminamos de entender bien como funcionarian los objetos dentro del ambiente en PHP5 lo cual nos trae dudas al tratar de hacer las cosas de acuerdo al paradigma e interpretar la dinamica del sistema de un diseño UML que se hizo pensando en Java, principalmente por el tema de performance con PHP.

Al grano...

Imaginen que el sistema tiene un Objeto Clase USUARIO, el cual tiene un Atributo FACTURAS que es una coleccion de Objetos Clase Factura, y mi objeto Factura tiene un Atributo llamado Items que es una coleccion de Objetos de la Clase Item.

Bien, la Clase Usuario ademas tiene un metodo que se llama mostrarLasFacturas(); y otro que es mostrarLasFacturasImpagas(); que hacen mas o menos lo que dicen...

Ahora supongamos que tengo que tirar una pantalla con la lista de Facturas.

Mas o menos seria una cosa asi...

Código PHP:
<?
// Esto seria el index.php al que accede el usuario desde su navegador

$accion $_GET[accion];
$JuanCarlos = new Usuario();

switch (
$accion){
case 
facturas:
$JuanCarlos->mostrarFacturas();
break;
case 
impagas:
$JuanCarlos->mostrarFacturasImpagas();
break;
}
?>
Todo bien hasta aqui.... ahora la pregunta/duda existencial es, como funciona dentro del servidor este ejemplo,

O sea... cada vez que quiera tirar un listado de facturas en PHP el servidor tiene que :

1 - Crear una instancia del Objeto Usuario.
2 - Consultar a la base de datos todos los datos del usuario para llenar sus atributos
3 - Por lo tanto crar sus facturas, y consultar las datos de sus facturas
4 - Crear los objetos items y consultar a la DB
5 - Levantar todo el objeto usuario en el ambiente
6 - Ejecutar el metodo que le pido y devolver el listado de facutras, que es un HTML por ejemplo.

?¿

Y luego de hacer es laburo para tirar un listado de facturas, que pasa con el objeto, se va al caño, queda en algun lado, lo puedo usar de nuevo sin reinstanciarlo ?

O si pido de nuevo el listado de facturas, me tiene que levantar de nuevo el objeto en el ambiente desde la persistencia?

El objeto sigue vivo en algun lado, en la sesion?

Si desde otro navegador el mismo usuario accede y consulta por las facturas impagas, el sistema tiene que volver a crear el usuario en memoria, consultar a la base de datos, y ejecutar la otra funcion?

El tema es entender que hace el php con los objetos de forma interna, si levanta el ambiente cada vez que se llama a un script, si los objetos se utilizan de varias sesiones, si quedan los objetos en algun lado, se pueden usar desde una sesion sin reinstanciarlos, porque es un tema jorobado de performance y uso de recursos... y no sabemos si un diseño pensado para java se plancha en php asi nomas o hay que repensarlo todo de nuevo por estos temas.

Bueno este es el 80% de lo que sinceramente no entendemos bien. Yo tengo poca experiencia en POO y ella es Java 100% Poo, virtual machine y servlets... otra cosa, asi que cualquier ayuda clarificante sera muy agradecida.

Saludos!
K.
  #2 (permalink)  
Antiguo 16/09/2007, 10:59
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Re: Que pasa en el Ambiente ?

Saludos Kurk,

Para entender un poco esto de los objetos en PHP, tienes que saber primero como funciona el PHP Engine.

Cuando tu inicias una instancia de un script ej: index.php, el server checa si tiene registrada la extension php y procesa el script PHP.

Ahora cuando el Parser de PHP inicia, checa todos los includes, requires, etc. y parsea el contenido y lo traduce a Bytecodes para entonces que el interprete de PHP lo ejecute.

A donde quiero llegar con esto? a que cada script unico es una instancia unica de PHP, es decir, todo lo que se cree y se ejecute, al final de cada script es borrado y limpiado.

Si tu quieres persistir un objeto/variable para que en la siguiente ejecucion de tu script lo tengas disponible, debes de usar un medio persistente.

Este puede ser una base de datos con una tabla de cache, o usar una sesion, con esto garantizas que puedas transmitir un objeto entre instancias de PHP.

Ahora, conexiones a bases de datos no las puedes persistir de esta forma, para eso todoas las extensiones de base de datos para PHP (la mayoria) tienen un metodo para realizar una conexion persistente a la base de datos, que en cuanto cambias de instancia la puedes rescatar.

Espero con esto aclares tus dudas de donde y como quedan las variables despues de pasarlas por un script.

Saludos.
  #3 (permalink)  
Antiguo 16/09/2007, 13:52
 
Fecha de Ingreso: septiembre-2007
Mensajes: 5
Antigüedad: 16 años, 7 meses
Puntos: 0
De acuerdo Re: Que pasa en el Ambiente ?

Era lo que imaginábamos, si entendimos bien lo que comentas significa que el PHP no guarda el ambiente de objetos por cada Request, o sea, lo regenera por cada solicitud.

Esto limita un poco el diseño de objetos, ya que encapsular la información dentro de los objetos de forma anidada hace que los objetos sean muy "pesados" para estar creándolos por cada request que según me comentaron esto es bastante común en Java.

De hecho en el diseño que estamos viendo, hay muchos objetos que tienen dentro, colecciones de objetos anidadas, de manera que se pueda manipular la informacion del objeto para un fin determinado, de una forma tipo $valorItem = Usuario>Facturas>Factura>Items>Item>Valor,

Pero si el ambiente se crea para cada request no conviene estar levantando de la persistencia toda la información del usuario, sino directamente apuntar al valor que se necesita, ya que es mucho mas rápido.

Sinceramente pense que el PHP5 tendria alguna forma de manejar la persistencia de los objetos en el ambiente, sin estar recreandolos desde la base de datos, ya que apunta mas al paradigma de objetos esta version.

Pero si no es así, creo que es importante tener en cuenta esta cuestión al momento de realizar el diseño de un sistema, ya que si se crean objetos así, el sistema usaría todo el tiempo recursos del servidor de forma innecesaria.

Creo que este seria un motivo para considerar distinta la aproximacion a la POO de PHP5 que otros lenguajes.

Muchas gracias por tu respuesta,
Saludos.
K.
  #4 (permalink)  
Antiguo 16/09/2007, 21:15
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Re: Que pasa en el Ambiente ?

Aun asi como lo comentas, creo tu disenio esta mal planteado, si cada que creas un objeto usuario, tienes que levantar todos esos datos (facturas, items, item), entonces estas descargando de la base de datos, cosas que no vas a usar.

Asi como te comento SI es posible persistir algunos objetos, agregando el codigo en el destructor del objeto para que se almacenen en una variable de session.

Aunque todavia sigo pensando que lo mejor seria que tubieras metodos listarFacturas que hicieran una consulta a la base de datos, y en dado caso usar muchas variables de cache.

Personalmente creo es mas limpia la forma en la que trabaja PHP, ya que asi es menos probable que termines con multiples objetos basura en memoria, y datos que probablemente no sean los actuales ya que no se reflejan de la base de datos.

Saludos.
  #5 (permalink)  
Antiguo 17/09/2007, 07:07
 
Fecha de Ingreso: septiembre-2007
Mensajes: 5
Antigüedad: 16 años, 7 meses
Puntos: 0
De acuerdo Re: Que pasa en el Ambiente ?

Sin duda, por estos motivos vamos a replantear el sistema desde el diseño, y aunque se puedan persistir los objetos pasandolos por variable de sesion, coincido en que es mucho mejor tener un metodo listarFacturas para estos casos.

Lo que me deja pensando, es que seria un error comerse todos los libros de POO y Patrones de Diseño y mandarse a programar en PHP, porque podrian salir muy mal las cosas, mas que nada porque pensar un sistema para Java, no es lo mismo que pensarlo para PHP5, aun cuando desde lejos, ambos se dicen entornos preparados para la POO, pero me parece que son bien distintos, mas alla de lo tipado de un lenguaje o la sintaxis, hay cosas de fondo importantes como saber que Java persiste los objetos en el ambiente y PHP no.

Gracias por tus comentarios GatorV, Saludos!
K.
  #6 (permalink)  
Antiguo 17/09/2007, 08:08
Avatar de enriqueplace  
Fecha de Ingreso: mayo-2005
Ubicación: Uruguay / Argentina
Mensajes: 1.102
Antigüedad: 19 años
Puntos: 32
Re: Que pasa en el Ambiente ?

Cita:
Era lo que imaginábamos, si entendimos bien lo que comentas significa que el PHP no guarda el ambiente de objetos por cada Request, o sea, lo regenera por cada solicitud.
Esta discusión la tuvimos en algún momento, y refresco el tema: aquí estamos en un entorno "desconectado" ("stateless") y eso es simplemente el concepto base de la web (me solicitan información, el servidor la devuelve, posteriormente se olvida quién la pidió).

Lo que sucede posteriormente es que las arquitecturas (como Java) crean "capas" para resolver este tipo de "situaciones" y buscan esa practicidad que obtienes cuando trabajas en el escritorio ("nunca te desconectas").

Cita:
Esto limita un poco el diseño de objetos, ya que encapsular la información dentro de los objetos de forma anidada hace que los objetos sean muy "pesados" para estar creándolos por cada request que según me comentaron esto es bastante común en Java.
Bien, pero eso es porque la arquitectura Java lo resuelve de otra forma (pero abajo de la arquitectura sigue estando el "stateless"). Pero tú no estás ahora en Java, y menos en una arquitectura, estás sobre un lenguaje.

Lo de "objetos pesados" es un problema de diseño, que perfectamente lo puedes resolver con un patrón Proxy.

Cita:
De hecho en el diseño que estamos viendo, hay muchos objetos que tienen dentro, colecciones de objetos anidadas, de manera que se pueda manipular la informacion del objeto para un fin determinado, de una forma tipo $valorItem = Usuario>Facturas>Factura>Items>Item>Valor,
¿Y realmente necesitas cargar toda esta información de esta forma para resolver ese problema?

Cita:
Sinceramente pense que el PHP5 tendria alguna forma de manejar la persistencia de los objetos en el ambiente, sin estar recreandolos desde la base
de datos, ya que apunta mas al paradigma de objetos esta version.
El paradigma no tiene nada que ver con la persistencia que buscas, el problema es que tú estás buscando trabajar igual que en Java y hay muchas distancias.

Cita:
Pero si no es así, creo que es importante tener en cuenta esta cuestión al momento de realizar el diseño de un sistema, ya que si se crean objetos así, el sistema usaría todo el tiempo recursos del servidor de forma innecesaria.
No es tan así, pero tienes que tener en cuenta tu contexto.

Cita:
Creo que este seria un motivo para considerar distinta la aproximacion a la POO de PHP5 que otros lenguajes.
Nuevamente, la POO no tiene nada que ver en tu problema concreto.
__________________
Blog phpsenior.com Cursos a Distancia surforce.com
  #7 (permalink)  
Antiguo 17/09/2007, 08:12
Avatar de enriqueplace  
Fecha de Ingreso: mayo-2005
Ubicación: Uruguay / Argentina
Mensajes: 1.102
Antigüedad: 19 años
Puntos: 32
Re: Que pasa en el Ambiente ?

Cita:
Iniciado por Kurk Ver Mensaje
Lo que me deja pensando, es que seria un error comerse todos los libros de POO y Patrones de Diseño y mandarse a programar en PHP, porque podrian salir muy mal las cosas, mas que nada porque pensar un sistema para Java, no es lo mismo que pensarlo para PHP5, aun cuando desde lejos, ambos se dicen entornos preparados para la POO, pero me parece que son bien distintos, mas alla de lo tipado de un lenguaje o la sintaxis, hay cosas de fondo importantes como saber que Java persiste los objetos en el ambiente y PHP no.
Pero te contestas tú solo

Tu error es comparar ambientes distintos, máxime, una arquitectura contra un lenguaje, nada tiene que ver con los conceptos de POO, tu problema es otro.
__________________
Blog phpsenior.com Cursos a Distancia surforce.com
  #8 (permalink)  
Antiguo 17/09/2007, 08:14
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Re: Que pasa en el Ambiente ?

Como bien enrique lo dijo, en Java se crea una capa extra para manejar esos objetos persistentes, facilmente lo puedes implementar en PHP, solo seria que te dieras a la tarea de hacerlo.

Saludos.
  #9 (permalink)  
Antiguo 17/09/2007, 11:42
 
Fecha de Ingreso: septiembre-2007
Mensajes: 5
Antigüedad: 16 años, 7 meses
Puntos: 0
Re: Que pasa en el Ambiente ?

Me queda mas claro, el error fue creer que un diseño UML de un diagrama de Clases era una abstraccion del lenguaje para representar un sistema. Parece que no es tan asi despues de todo.

Gracias por los comentarios.! Saludos.
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 11:50.