Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > PHP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 21-10-2007
Avatar de Io
[Io] Io is offline
Miembro Premium
 
Registrado: jul 2005
Ubicación: San Fernando (Cádiz)
Posts: 259
Poder: 19
Io Va por buen camino
Cómo saber si un objeto ha sido destruido

Saludos al Foro.

Utilizo un wamp (PHP5) .

Con la intención de tener un acceso global a un objeto (de una clase de acceso a bases de datos mysql), he utilizado la varible superglobal $_SESSION.

La instrución sería:
Código:
$_SESSION['mi_clase']= new C_MI_CLASE;
Como esperaba accedo desde cualquier sitio, a los métodos y propiedades.

El problema, es que hay algún momento, en que se destruye el objeto (Todavía no se dónde, por el momento). Para prevenir el uso del objeto previamente liberado, he utilizado las funciones: isset(),empty(),is_null(). Con ninguna de estas funciones soy capaz, de comprobar si el objeto ha sido destruido previamente, con lo cual casca.
He descubierto que el problema es éste, porque puse una instrucción echo "Objeto destruido"; , en el metodo destructor de la clase, el cual me confirma que habia sído destruido.

Gracias
Responder Con Cita
  #2  
Antiguo 21-10-2007
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

No estoy muy puesto, pero, cuando yo quiero que la instancia de un objeto esté disponible "globalmente" no uso la sesión de usuario, sino, propiamente, una variable global:

Código PHP:
$GLOBALS['miobjeto'] = new MiClase(); 
Tal vez los tiros puedan ir por ahí... puesto que la sesión de usuario "se controla", de alguna manera, y acaso, sin que lo quieras, tu objeto es destruido "desde fuera"... prueba a ver con variables "globales" en lugar de con la sesión de usuario.

PD. Para comprobar si una determinada variable global contiene la instancia válida de un objeto, pues creo que las funciones que mencionas pueden servir... cada una a su modo, pero, todas pueden servir. "empty()" podría valer, puesto que la variable no debería estar "vacía"; "is_null()" también podría valer, puesto que la variable de marras no debería ser "nula", e "isset()" también podría valer, puesto que la variable debería estar "seteada" correctamente.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #3  
Antiguo 21-10-2007
Avatar de Io
[Io] Io is offline
Miembro Premium
 
Registrado: jul 2005
Ubicación: San Fernando (Cádiz)
Posts: 259
Poder: 19
Io Va por buen camino
Hola Dec.
Como siempre al pie del cañón.

Pensé en utilizar la variable $_SESSION, pues creía que se mantendría durante toda una sesión, con independencia de la página en la que te encuentres.
Cuando me comentas lo de utilizar, una variable global...qué ambito tendría esta variable. si la creo en index.php, cuando me redireccione a index2.php, ¿seguiría vigente esa variable?, o sería mejor crearla en un documento comun: comun.php.
Todo es probarlo, con respecto a las funciones que hice referencia, ninguna me sirvió, para comprobar que el objeto había sido destruido

Saludos
Responder Con Cita
  #4  
Antiguo 21-10-2007
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Cita:
Empezado por Io
Pensé en utilizar la variable $_SESSION, pues creía que se mantendría durante toda una sesión, con independencia de la página en la que te encuentres.
Hum... no estoy seguro. No suelo utilizar esa variable, y no estoy seguro de si podría guardar instancias de clases... me da que no, pero, es una especie de pálpito sin valor alguno, porque ya digo que no lo sé.

Cita:
Empezado por Io
Cuando me comentas lo de utilizar, una variable global...qué ambito tendría esta variable. si la creo en index.php, cuando me redireccione a index2.php, ¿seguiría vigente esa variable?, o sería mejor crearla en un documento comun: comun.php.
Depende de lo que entendamos por "redirección". Tú puedes crear una variable global en "index.php", requerir el archivo "index2.php" y seguir usando dicha variable. Ahora bien, si realmente "cargas" o "rediriges" (como dices) de una página a otra... me temo que el remedio está en lo último que dices: crear la variable en "comun.php" y requerir dicho archivo tanto en "index.php" como en "index2.php".

Aquí hay que ver el asunto de "mantener la instancia de una clase" entre sesiones... o en distintas páginas... Creo que para esto debe usarse la "serialización" de objetos (serialize(), unserialize()), puesto que de otro modo no se me ocurre... Pero, tal vez es un problema de concepto, quiero decir, de pensar que es preciso mantener la instancia de una determinada clase a toda costa.

Yo, por ejemplo, ahora trabajo con cierto proyecto en el que hago uso de varias variables globales que contienen instancias de objetos. Pues bien, estas están ahí disponibles para todos los Scripts PHP que se requieran (nunca mejor dicho) en el sistema, pero, cuando "redirigo" al usuario a otra página, es menester incluir el archivo "común" de que hablamos antes, de modo que las variables estén disponibles "de nuevo".

Evidentemente, son nuevas instancias de las variables, no son la misma, pero, en el caso de mi sistema basta y sobra de este modo, es decir, las variables en cuestión cumplen con unas determinadas funciones y lo que es menester es que estén disponibles, no que sean "la misma instancia" siempre. Pero, no sé si me estoy explicando correctamente...

Trataré de poner un ejemplo sin resultar pesado. Yo tengo una clase "Opciones" que maneja las opciones del usuario. Permite "setear" opciones, obtener el valor de las opciones, conseguir las opciones "por defecto", etc. Pues bien, lo que hago es instanciar una variable "global" del objeto "Opciones" en el archivo común de que venimos hablando, pero, da igual que no sea la misma instancia siempre, puesto cualquier objeto de esta clase hará lo que se espera de ella.

Hablando de serialización... lo mismo te interesa esto, justamente. Seguramente puedes guardar la instancia de una determinada clase "serializada" en la sesión de usuario, en una base de datos, o donde quieras, de modo que cuando "deserializes", obtengas una nueva variable, sí, pero, que vendría a ser una "copia" de la instancia de la clase que guardaste. Ahora bien, esto sí que lo veo más factible, porque, cuando guardas una clase "serializada" en la sesión de usuario, por ejemplo, estás guardando una cadena de caracteres.

Así que el asunto (y me estoy extendiendo ya mucho, pido disculpas) puede pasar por usar la serialización, si es que necesitas mantener a toda costa la misma instancia de una clase (pero tendrías que "deserializarla" antes de usarla, claro está), o, más sencillamente aún, por ver si podrías apañarte como yo con la clase "Opciones", que no precisa que sea la misma instancia... (¿hasta cuándo? ¿siempre?) sino que puede cumplir con su función en el momento en que es instanciada.

Respecto de las funciones que "no te funcionan"... bueno... habría que ver los resultados que te ofrecen, pero, el asunto puede no ser tanto ver si un objeto ha sido destruido, sino que, ya no existe, sencillamente. Y para esto debería servir cualquiera de las funciones mencionadas (según qué quiera hacerse), puesto que una variable que no contiene la instancia de un objeto, o más aún que no contiene nada... será "empty", será "null", no estará "seteada"... y con eso sabes que no existe, independientemente de si fue creada o no antes.

Piensa además en otra cosa: mantener en memoria una determinada variable... tiene un coste. Así que aunque pudiera hacerse (que no lo sé bien, como digo), lo cierto es que puede que el coste supere el beneficio. No sé si me explico. Ya te digo. En el sistema en que trabajo (que acaso veas pronto por aquí...) hago uso de variables globales que contiene instancias de objetos, pero, no tienen que ser "la misma instancia", no es necesario que esto sea así.

Por último... tal vez si dices qué quieres conseguir, para qué quieres hacer lo que dices, yo o algún otro compañero podamos ayudarte a hacerlo de otro modo... Y, disculpa el rollo que he soltado... que lo mismo no tiene muchos pies ni cabeza...
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #5  
Antiguo 21-10-2007
Avatar de Io
[Io] Io is offline
Miembro Premium
 
Registrado: jul 2005
Ubicación: San Fernando (Cádiz)
Posts: 259
Poder: 19
Io Va por buen camino
Guauu.....Sólo por lo que has escrito te mereces un abrazo (sin tener que salir del armario).

Creo que te he entendido perfectamente. El interés de querer mantener, la instancia de este objeto, es simplemente, porque una de las propiedades de este objeto es el enlace que me devuelve la función mysql_connect (), y es utilizado por todas las clases descendientes para la comunicación,gestión de la Bd.

Código:
function Conectar($Host,$User,$Pwd)        
        {

            $this->Cod_Error=0;
            $This->Des_Error="";

            if ($this->FConectado)
                Desconectar();

            $this->Link=@mysql_connect ($Host,$User,$Pwd);

            if($this->Link)
            {
                $this->FConectado=1;
                $this->CargaBds();
            }
            else
            {
                $this->FConectado=0;

                $this->Cod_Error=1;
                $This->Des_Error="No se ha podido establecer Conexión";
            }
            
            return $this->FConectado;
        }

La idea es conectarme sólo una vez y gestionar esta conexión durante toda la sesión.

Respecto al problemas de las funciones, creo y sólo creo, que al crear la clase, la variable es un puntero, en la cuál, se guarda una dirección de memoria, por ejemplo 0xfffff, en la cual se guardará el nuevo objeto. Cuando el objeto se destruye se libera la memoría utilizada por el objeto, comenzando por 0xfffff. Pero, y creo que aquí está el problema, la variable sigue teniendo almacenada la dirección 0xfffff. La variable, no es null, no está vacía, y contiene un valor. Las funciones no detectan esta situación.

Todo lo anterior, es lo que creo.

Saludos
Responder Con Cita
  #6  
Antiguo 21-10-2007
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Bien. No creo que interese mantener la conexión "activa". No lo digo con mucho conocimiento de causa, pero, para tratar con bases de datos MySQL, el proyecto WordPress, Menéame, y yo mismo... he usado siempre una adaptación de la clase ezSQL de Justin Vincent. Esto es así porque una vez que conoces esta clase ya no quieres otra cosa...

Mi adaptación de la clase la adjunto a continuación. Puede que te cueste entrarle, pero, como le llegues a entrar, te aseguro que no querrás otra cosa: al menos a mí me parece que es estupenda, vaya. Mira de bajarte la clase original para estudiarla, pero, como me parece que esta ha "crecido" bastante... echa un vistazo también a "mi adaptación", que te adjunto. (Si tienes algún problema avisa).

Pero, en fin, a lo que íbamos... no creo que merezca la pena mantener la conexión, entre otras cosas, por el gasto que pueda conllevar. Personalmente, ya digo, uso la clase que adjunto para comunicar con bases de datos MySQL. Precisamente, una de las variables globales de mi sistema guarda una instancia de dicha clase, mejor dicho, de una que deriva de ella, pero, para el caso es lo mismo.

Y el caso es que al inicio de mi sistema se requieren los archivos necesarios y se instancia dicha clase en una variable global. Mientras se van requiriendo archivos no es preciso hacer más: la variable global mantiene la instancia de la clase, con la conexión a la base de datos, de modo que puede uno usarla sin preocuparse de más.

Y, cuando "rediriges" a otro Script... dicho Script sí o sí ha de requerir el archivo donde se declara la variable global y se "construye" la clase (es en el constructor de la clase que se realiza la conexión a la base de datos). Pero, ya digo... proyectos como WordPress, Menéame y algunos que yo he llevado a cabo, más humildemente, no necesitan mantener la conexión a la base de datos hasta el punto que dices.

De todos modos, lo mismo que existe "mysql_connect()", existe también "mysql_pconnect()": la "p" es de "permanent", y se diferencia de "mysql_connect()", según la ayuda:

Cita:
Primero, durante la conexión, la función intenta primero encontrar un enlace persistente abierto con el mismo host, usuario y password. Si lo encuentra, devuelve el identificador de enlace en lugar de abrir otra conexión.

Segundo, la conexión no será cerrada cuando acabe la ejecución del script. El enlace permanecerá abierta para ser usado en el futuro (mysql_close() no cierra el enlace establecido con mysql_pconnect()).
Quiero decir que, efectivamente, existe la posibilidad de mantener una conexión con la base de datos de forma permanente, y digo yo (en mi ignorancia) que de algo habrá de servir... Pero, francamente, nunca me he visto en la necesidad de usarla, y, casi estoy por asegurar que tú tampoco lo necesitas para lo que pretendes hacer.

Así que lo dicho: una clase que se conecta con la base de datos, la selecciona y permite trabajar con ella... no tiene porqué "persistir" entre sesiones, sino que basta conque se "instancie" y haga su trabajo cada vez que esto sea necesario. Yo vengo funcionando así... WordPress... Menéame... también (de Menéame no estoy al cien por cien seguro porque hace tiempo que no miro su código), así que... tal vez tú tampoco necesites otra cosa.
__________________
David Esperalta
www.decsoftutils.com

Última edición por dec fecha: 02-05-2008 a las 15:55:19.
Responder Con Cita
  #7  
Antiguo 21-10-2007
Avatar de Io
[Io] Io is offline
Miembro Premium
 
Registrado: jul 2005
Ubicación: San Fernando (Cádiz)
Posts: 259
Poder: 19
Io Va por buen camino
Ok.
Creo que la experiencia, es un grado., y tendré en cuenta el asunto de no tener que mantener una conexión permanentemente.

Gracias, por el adjunto, lo echaremos un vistazo dedpues de la formula one.

AUPA ALONSO!!!!!
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
como acceder a un objeto si el nombre es pasado como un string marcelinux Varios 4 08-11-2007 00:20:39
Si yo hubiera sido... xander La Taberna 0 30-11-2006 03:32:25
Saber si un archivo ha sido modificado desde fuera ixMike Varios 7 11-09-2006 19:13:14
Como saber si un Formulario ha sido creado Durbed OOP 7 13-10-2005 13:06:28
Saber en qué path está mi ejecutable (sin usar el objeto Application) Feñiz OOP 2 17-02-2005 16:36:41


La franja horaria es GMT +2. Ahora son las 17:50:19.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi