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

Objetos globales??

Estas en el tema de Objetos globales?? en el foro de Frameworks y PHP orientado a objetos en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 14/02/2005, 20:41
Avatar de stock  
Fecha de Ingreso: junio-2004
Ubicación: Monterrey NL
Mensajes: 2.390
Antigüedad: 19 años, 10 meses
Puntos: 53
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!!
  #2 (permalink)  
Antiguo 14/02/2005, 23:39
Avatar de Reynier  
Fecha de Ingreso: noviembre-2002
Ubicación: Por ahí en algún sitio
Mensajes: 1.844
Antigüedad: 21 años, 5 meses
Puntos: 1
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
__________________
Ing. Reynier Pérez Mira
  #3 (permalink)  
Antiguo 15/02/2005, 00:18
Avatar de Webstudio
Colaborador
 
Fecha de Ingreso: noviembre-2001
Ubicación: 127.0.0.1
Mensajes: 3.499
Antigüedad: 22 años, 6 meses
Puntos: 69
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.
__________________
Tutoriales Photoshop | Web-Studio.com.ar
Artículos PHP | ZonaPHP.com
  #4 (permalink)  
Antiguo 15/02/2005, 19:33
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 20 años, 7 meses
Puntos: 41
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
  #5 (permalink)  
Antiguo 15/02/2005, 22:16
Avatar de Webstudio
Colaborador
 
Fecha de Ingreso: noviembre-2001
Ubicación: 127.0.0.1
Mensajes: 3.499
Antigüedad: 22 años, 6 meses
Puntos: 69
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
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.
__________________
Tutoriales Photoshop | Web-Studio.com.ar
Artículos PHP | ZonaPHP.com
  #6 (permalink)  
Antiguo 16/02/2005, 15:19
 
Fecha de Ingreso: septiembre-2001
Ubicación: Monterrey
Mensajes: 663
Antigüedad: 22 años, 7 meses
Puntos: 6
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.
  #7 (permalink)  
Antiguo 16/02/2005, 20:51
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 20 años, 7 meses
Puntos: 41
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
  #8 (permalink)  
Antiguo 18/02/2005, 15:40
 
Fecha de Ingreso: enero-2004
Mensajes: 235
Antigüedad: 20 años, 4 meses
Puntos: 0
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
  #9 (permalink)  
Antiguo 18/02/2005, 18:50
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 20 años, 7 meses
Puntos: 41
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
  #10 (permalink)  
Antiguo 22/02/2005, 11:34
 
Fecha de Ingreso: septiembre-2001
Ubicación: Monterrey
Mensajes: 663
Antigüedad: 22 años, 7 meses
Puntos: 6
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.
  #11 (permalink)  
Antiguo 22/02/2005, 21:20
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 20 años, 7 meses
Puntos: 41
Perfecto... Gracias!

Saludos
  #12 (permalink)  
Antiguo 23/02/2005, 19:59
 
Fecha de Ingreso: noviembre-2003
Mensajes: 96
Antigüedad: 20 años, 6 meses
Puntos: 0
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!!!!!!
  #13 (permalink)  
Antiguo 23/02/2005, 20:37
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 20 años, 7 meses
Puntos: 41
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
  #14 (permalink)  
Antiguo 23/02/2005, 20:43
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 20 años, 7 meses
Puntos: 41
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
  #15 (permalink)  
Antiguo 23/02/2005, 21:15
 
Fecha de Ingreso: noviembre-2003
Mensajes: 96
Antigüedad: 20 años, 6 meses
Puntos: 0
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

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
  #16 (permalink)  
Antiguo 23/02/2005, 21:41
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 20 años, 7 meses
Puntos: 41
jeka...
Te aconsejo hacer tu pregunta en un tema aparte (nuevo) para que sean lo más específicos posible.

Un saludo
  #17 (permalink)  
Antiguo 24/02/2005, 10:00
 
Fecha de Ingreso: septiembre-2001
Ubicación: Monterrey
Mensajes: 663
Antigüedad: 22 años, 7 meses
Puntos: 6
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.
  #18 (permalink)  
Antiguo 24/02/2005, 20:39
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 20 años, 7 meses
Puntos: 41
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
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 12:12.