Foros del Web

Foros del Web (http://www.forosdelweb.com/)
-   Frameworks y PHP orientado a objetos (http://www.forosdelweb.com/f68/)
-   -   Objetos globales?? (http://www.forosdelweb.com/f68/objetos-globales-270787/)

stock 14/02/2005 20:41

Objetos globales??
 
hello everybody!!

Solo para hacer una pregunta, es posible crear un objeto, pero que lo pueda usar en todas mis paginas PHP, es decir, que no pierda sus atributos que le halla asignado el momento de instanciarlo, y que pueda usarlo por todos mis documetnos PHP, algo asi como las seciones.

es eso posible???

thanks!!

Reynier 14/02/2005 23:39

Pues ...
 
No estoy seguro pero creo que no. PHP crea las variables cuando las usa y eso solo ocurre en una sola pagina. Por eso muchas personas usan las cookies y las sesiones para almacenar el contenido de una variable "X" y asi poder usarlo en otra pagina. Una sugerencia seria que crearas una sesion o una cookie para almacenar el contenido de esta variable y entonces cuando no las vayes a usar mas simplemente las destruyes y ya.

Salu2 :pensando:

Webstudio 15/02/2005 00:18

Existen maneras de simular la persistencia de objetos a través de distintas llamadas, y esto es algo que se utiliza hace mucho tiempo en PHP. Tan simple como crear una tabla con los atributos de tu objeto, y luego un Mapper, que cargue esos datos desde la tabla, instancie el objeto necesario, le cargue los datos y lo devuelva.

Supongamos que tenemos la definición de un objeto en un archivo class.Objeto.php:
Código PHP:

<?php
class Objeto
{
    var 
$alto;
    var 
$ancho;
    var 
$largo;
    
    function 
Objeto()
    {
    
    }
    
    function 
superficie()
    {
        return 
$this->ancho $this->alto $this->largo;
    }
}
?>

Luego, tenemos su Mapper, llamado class.ObjetoMapper.php :

Código PHP:

<?php
class ObjetoMapper
{
    function &
cargar$id )
    {
        
$query "SELECT alto, ancho, largo FROM tabla WHERE id=$id";
        
        
//... ejecutamos un query de la manera que prefieran
        //... y obtenemos el array con los datos
        
$row mysql_fetch_object($rs);
        
        require_once(
'class.Objeto.php');
        
$obj =& new Objeto();
        
$obj->alto $row->alto;
        
$obj->ancho $row->ancho;
        
$obj->largo $row->largo;
        
        return 
$obj;
    }
}
?>

Y finalmente, podemos invocar el uso de esta manera :
Código PHP:

<?php
$id 
$_SESSION['id'];
$objeto =& ObjetoMapper::cargar($id);

// $Objeto ya es un Objeto instanciado
echo $objeto->superficie();
?>

De esta manera se mantiene separado, un objeto instanciado, de la capa de datos que lo sostiene (la Base de Datos en este caso) delegando el conocimiento de ambos estados ( instancia y base de datos ) al Mapper, que sabe como encargarse de leer un Objeto del contenedor de datos y devolverlo instanciado. En este ejemplo, para grabar un objeto en la base, tan solo habría que pasarle la instancia al Mapper, que sacaría los atributos, formaría el Query y lo ejecutaría contra la base, grabando el objeto.

Espero que les haya servido el ejemplo. Saludos.

jpinedo 15/02/2005 19:33

Muy didáctica la respuesta Webstudio...

Ahora... esto es así de sencillo para un objeto simple... pero si tenemos objetos relacionados entre sí supongo que el mapeo de objetos a tablas (y viceversa) se complicaría más o menos de acuerdo al tipo de relación que los une (herencia, agregación, composición).

Saludos:adios:

Webstudio 15/02/2005 22:16

Cita:

Iniciado por jpinedo
Muy didáctica la respuesta Webstudio...

Ahora... esto es así de sencillo para un objeto simple... pero si tenemos objetos relacionados entre sí supongo que el mapeo de objetos a tablas (y viceversa) se complicaría más o menos de acuerdo al tipo de relación que los une (herencia, agregación, composición).

Saludos:adios:

Esto es así, pero por eso las técnicas de Mapeo de objetos a bases de datos relacionales vienen en estudio y aplicación hace ya más de 20 años, habiendo patrones especialmente desarrollados para solucionar mucho de los problemas que planteas. Patrones como el Singleton, el Factory, el Gateway y el Mapper. Para quién tenga ganas de aprender en profundidad estas cosas, les recomiendo el libro Patterns of Enterprise Application Architecture, de Martin Fowler, sobre todo el capítulo 3, que puede encontrarse online , y que trata sobre este tema en profundidad.

Herminio Heredia San 16/02/2005 15:19

complementando un poco la exposicion de Webstudio, te puedo decir jpinedo que inclusive ya existen implementaciones de mappers en php uno lo puedes consultar en la documentacion de las pear http://pear.php.net/manual/en/packag...dataobject.php y el otro es una implementacion para php5 que tambien puedes consultar en http://propel.phpdb.org/wiki/ en particular he usado el primero, y a un que es interesante la herramienta todavia tiene algunas deficiencias a mi gusto, como el hecho de que se complica la programacion cuando estamos usando tablas que comparten la misma PK en varias relaciones. La segunda implementacion no he tenido tiempo de probarla a conciencia pero pudes probarla tu y despues comentarnos tu experiencia.

jpinedo 16/02/2005 20:51

Ok... muchas gracias a los dos... en cuanto tenga algo de tiempo me meto de cabeza a revisar los enlaces propuestos por ustedes.

Ahora tengo otra duda con respecto al mapeo que propone Webstudio...
Es verdad que la persistencia de objetos se puede solucionar con el mapeo. Pero me parece que si se está dentro de la misma sesión no sería conveniente en términos de rendimiento hacer dicho mapeo objeto-BD (y viceversa).
Simplemente podría guardarse la información necesaria (los atributos o los objetos serializados) en variables de sesión y desde ahí reconstruir los objetos.
Otro sería el caso si se necesitara que los objetos persistan de una sesión a otra.
Digo esto, porque evidentemente el código de Webstudio se maneja dentro de una misma sesión.
Supongo nuevamente que esto dependerá de la aplicación.

Saludos:adios:

jmaribau 18/02/2005 15:40

Jpinedo, esto es verdad hasta que la session està activa.
Normalmente la session tinen una vida determinada por el php.ini en los parámetros:

-session.cookie_lifetime especifica la duración de la cookie en segundos que se manda al navegador. El valor 0 significa "hasta que se cierra el navegador", y es el que se encuentra por defecto.

-session.cache_expire especifica el tiempo-de-vida de las páginas de la sesión que se encuentran en el caché en minutos. No tiene efecto para el limitador nocache. Por defecto vale 180.

Textos extraidos de la documentación de php

jpinedo 18/02/2005 18:50

Yo creo que te has confundido y no has entendido mi duda. Mi duda no va por el lado de la expiración de las sesiones, sino de la conveniencia (o no conveniencia) de utilizar un mapper como el que propone Webstudio cuando estamos dentro de la misma sesión.

Saludos:adios:

Herminio Heredia San 22/02/2005 11:34

Definitivamente decidiria por la solucion de Webstudio, ya que si requiero un objeto global a todo la aplicacion que pueda ser accedido con idenpendencia de la sesion, me sirve mas el mapper ya que el estado de un objeto esta en funcion de sus propiedades, asi que partiendo de ese punto facililtas el almacenamiento y recuperacion mediante una consulta que intentar otra cosa.
Ahora si estas dentro de una sesion y sabes que el objeto va estar cambiando su estado en cada peticion puede entonces ser factible serializar el objeto y al final guardarlo. todo depende de lo que necesites.

jpinedo 22/02/2005 21:20

Perfecto... Gracias!

Saludos:adios:

jeka 23/02/2005 19:59

Hola!!!!!!!!!!!!!

podrian explicarme como se serializa un objeto que esta dentro de una sesion, porq he leido algo sobre eso pero aun no me queda claro . . .

Saludos!!!!!!

jpinedo 23/02/2005 20:37

No se serializa el objeto que está en la variable de sesión.
Se serializa el objeto antes de guardarlo en una variable de sesión.
Luego, lo desserializas para reutilizarlo.
Recuerda que siempre necesitas tener la definición de la clase (el código de la clase) en los scripts que utilizarán ese objeto desserializado.
Serializar: función serialize()
http://www.php.net/serialize
Des-serializar: función unserialize()
http://www.php.net/unserialize

Saludos:adios:

jpinedo 23/02/2005 20:43

También puedes ver este artículo de zonaphp:
(te pongo el enlace a la parte en la que se toca el tema de serialización... pero deberías leerlo todo)
http://www.zonaphp.com/index.php?mod...&id=1&pagina=7

Saludos:adios:

jeka 23/02/2005 21:15

Gracias por tu respuesta, pero no consigo resolver el problemilla
 
Hola, disculpa por la insistencia pero he leido de todo y no se q hacer para resolver este problema con los objetos q los he puesto como variables de sesion, lei sobre serializacion y lo q me quedo claro que solo me sirve para conservar los atributos :neurotico

Deje esto en otro tema en el mismo foro, aver si me das una manito porfis :'(



Pasa q ademas del objeto de conexion tengo otro objeto que guarda el pedido q se realiza, este ultimo objeto es de la clase Carrito . . . lo q pasa es q cuando uso uno de estos en un pagina funciona pero cuando uso los dos ahi viene el error.

Las clases son asi:
<?
class Carrito(){

}
session_start();

if (!isset($_SESSION['ocarrito'])){
$_SESSION['ocarrito']=new carrito;
$_SESSION['ocarrito']->carrito();
}

?>

<?
class conexion(){

}
session_start();
if (!isset($_SESSION['oconexion'])){
$_SESSION['oconexion'] = new conexion() ;
$_SESSION['oconexion']->conectar();
}
?>

Los uso asi:
require('conexionBD.php');
$_SESSION['oconexion']->conectar();
require('carrito.php');
$_SESSION['ocarrito']->compras_hechas();
en esta ultima linea sale el error:
Fatal error: Unknown(): The script tried to execute a method or access a property of an incomplete object. Please ensure that the class definition <b>carrito</b> of the object you are trying to operate on was loaded _before_ the session

Porfis ayudemme
no se donde estoy haciendo mal o quiza asi no se usan las sesiones
Gracias

jpinedo 23/02/2005 21:41

jeka...
Te aconsejo hacer tu pregunta en un tema aparte (nuevo) para que sean lo más específicos posible.

Un saludo:adios:

Herminio Heredia San 24/02/2005 10:00

Código PHP:

require('conexionBD.php');
$_SESSION['oconexion']->conectar();
require(
'carrito.php');
$_SESSION['ocarrito']->compras_hechas();
//en esta ultima linea sale el error: 

En un mensaje te dije que tenias que poner la difinicion de las clases antes de las sesiones. asi que prueba en tu codigo lo siguiente..

Código PHP:

require('conexionBD.php');
require(
'carrito.php');
session_start();
$_SESSION['oconexion']->conectar();
$_SESSION['ocarrito']->compras_hechas();
//en esta ultima linea sale el error: 

El unico cambio es que puse las definiciones antes de que uses la sesion.

jpinedo 24/02/2005 20:39

Con la aclaración de Herrminio todo debe funcionar correctamente.
Y yo, aclarando lo que puse sobre la serialización, se me fue de las manos que estábamos hablando de sesiones:
Lo que pasa es que los objetos almacenados en sesiones se serializan/desserializan automáticamente al guardarlos/leerlos sin necesidad de utilizar las funciones explícitamente (serialize()/unserialize()).
http://www.php.net/manual/es/languag...ialization.php

Quería aclarar esto, ya que lo que puse antes puede dar lugar a confusiones.

Saludos:adios:


La zona horaria es GMT -6. Ahora son las 15:39.

Desarrollado por vBulletin® Versión 3.8.7
Derechos de Autor ©2000 - 2026, Jelsoft Enterprises Ltd.