Retroceder   Foros del Web > Programación para sitios web > PHP > PHP orientado a objetos

Respuesta
 
Herramientas Desplegado
Antiguo 14-feb-2005, 19:41   #1 (permalink)
stock tiene algunos puntos positivos de karma
 
Avatar de stock
 
Fecha de Ingreso: junio-2004
Ubicación: Monterrey NL
Mensajes: 1.995
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!!
__________________
Don't hate the languaje, hate the runtime environment
Crysfel's Blog :: Blog de programación, JAVA,PHP, AJAX, JavaScript, CSS y otras hierbas
stock está desconectado   Responder Citando
Antiguo 14-feb-2005, 22:39   #2 (permalink)
Reynier está en el buen camino
 
Avatar de Reynier
 
Fecha de Ingreso: noviembre-2002
Ubicación: Por ahí en algún sitio
Mensajes: 1.842
Enviar un mensaje por ICQ a Reynier Enviar un mensaje por MSN a Reynier Enviar un mensaje por Yahoo  a Reynier
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
Reynier está desconectado   Responder Citando
Antiguo 14-feb-2005, 23:18   #3 (permalink)
Colaborador
Webstudio tiene algunos puntos positivos de karma
 
Avatar de Webstudio
 
Fecha de Ingreso: noviembre-2002
Ubicación: 127.0.0.1
Mensajes: 3.343
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.
__________________
Productos en Venta | Hoy-Vendo.com.ar
Artículos PHP | ZonaPHP.com
Webstudio está desconectado   Responder Citando
Antiguo 15-feb-2005, 18:33   #4 (permalink)
Moderador PHP
jpinedo ha deshabilitado el karma
 
Avatar de jpinedo
 
Fecha de Ingreso: septiembre-2003
Ubicación: Piura
Mensajes: 2.753
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
jpinedo está desconectado   Responder Citando
Antiguo 15-feb-2005, 21:16   #5 (permalink)
Colaborador
Webstudio tiene algunos puntos positivos de karma
 
Avatar de Webstudio
 
Fecha de Ingreso: noviembre-2002
Ubicación: 127.0.0.1
Mensajes: 3.343
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.
__________________
Productos en Venta | Hoy-Vendo.com.ar
Artículos PHP | ZonaPHP.com
Webstudio está desconectado   Responder Citando
Antiguo 16-feb-2005, 14:19   #6 (permalink)
Herminio Heredia San está en el buen camino
 
Fecha de Ingreso: noviembre-2002
Ubicación: Monterrey
Mensajes: 663
Enviar un mensaje por ICQ a Herminio Heredia San
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.
__________________
Saludos!.
Mty. NL.
Herminio Heredia San está desconectado   Responder Citando
Antiguo 16-feb-2005, 19:51   #7 (permalink)
Moderador PHP
jpinedo ha deshabilitado el karma
 
Avatar de jpinedo
 
Fecha de Ingreso: septiembre-2003
Ubicación: Piura
Mensajes: 2.753
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
jpinedo está desconectado   Responder Citando
Antiguo 18-feb-2005, 14:40   #8 (permalink)
jmaribau está en el buen camino
 
Fecha de Ingreso: enero-2004
Mensajes: 235
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
jmaribau está desconectado   Responder Citando
Antiguo 18-feb-2005, 17:50   #9 (permalink)
Moderador PHP
jpinedo ha deshabilitado el karma
 
Avatar de jpinedo
 
Fecha de Ingreso: septiembre-2003
Ubicación: Piura
Mensajes: 2.753
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
jpinedo está desconectado   Responder Citando
Antiguo 22-feb-2005, 10:34   #10 (permalink)
Herminio Heredia San está en el buen camino
 
Fecha de Ingreso: noviembre-2002
Ubicación: Monterrey
Mensajes: 663
Enviar un mensaje por ICQ a Herminio Heredia San
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.
__________________
Saludos!.
Mty. NL.
Herminio Heredia San está desconectado   Responder Citando
Antiguo 22-feb-2005, 20:20   #11 (permalink)
Moderador PHP
jpinedo ha deshabilitado el karma
 
Avatar de jpinedo
 
Fecha de Ingreso: septiembre-2003
Ubicación: Piura
Mensajes: 2.753
Perfecto... Gracias!

Saludos
jpinedo está desconectado   Responder Citando
Antiguo 23-feb-2005, 18:59   #12 (permalink)
jeka está en el buen camino
 
Fecha de Ingreso: noviembre-2003
Mensajes: 97
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!!!!!!
jeka está desconectado   Responder Citando
Antiguo 23-feb-2005, 19:37   #13 (permalink)
Moderador PHP
jpinedo ha deshabilitado el karma
 
Avatar de jpinedo
 
Fecha de Ingreso: septiembre-2003
Ubicación: Piura
Mensajes: 2.753
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
jpinedo está desconectado   Responder Citando
Antiguo 23-feb-2005, 19:43   #14 (permalink)
Moderador PHP
jpinedo ha deshabilitado el karma
 
Avatar de jpinedo
 
Fecha de Ingreso: septiembre-2003
Ubicación: Piura
Mensajes: 2.753
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
jpinedo está desconectado   Responder Citando
Antiguo 23-feb-2005, 20:15   #15 (permalink)
jeka está en el buen camino
 
Fecha de Ingreso: noviembre-2003
Mensajes: 97
Triste 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
jeka está desconectado   Responder Citando
Antiguo 23-feb-2005, 20:41   #16 (permalink)
Moderador PHP
jpinedo ha deshabilitado el karma
 
Avatar de jpinedo
 
Fecha de Ingreso: septiembre-2003
Ubicación: Piura
Mensajes: 2.753
jeka...
Te aconsejo hacer tu pregunta en un tema aparte (nuevo) para que sean lo más específicos posible.

Un saludo
jpinedo está desconectado   Responder Citando
Antiguo 24-feb-2005, 09:00   #17 (permalink)
Herminio Heredia San está en el buen camino
 
Fecha de Ingreso: noviembre-2002
Ubicación: Monterrey
Mensajes: 663
Enviar un mensaje por ICQ a Herminio Heredia San
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.
__________________
Saludos!.
Mty. NL.
Herminio Heredia San está desconectado   Responder Citando
Antiguo 24-feb-2005, 19:39   #18 (permalink)
Moderador PHP
jpinedo ha deshabilitado el karma
 
Avatar de jpinedo
 
Fecha de Ingreso: septiembre-2003
Ubicación: Piura
Mensajes: 2.753
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
jpinedo está desconectado   Responder Citando
Respuesta

No hay votos aún.


Herramientas
Desplegado

Normas de Publicación
No puedes crear nuevos temas
No puedes responder temas
No puedes subir archivos adjuntos
No puedes editar tus mensajes

BB code is Activado
Caritas están Activado
[IMG] está Activado
Código HTML está Desactivado


La Zona horaria es GMT -6. Ahora son las 04:33.


Message Board Statistics

LinkBacks Enabled by vBSEO 3.1.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93