Ver Mensaje Individual
  #3 (permalink)  
Antiguo 09/09/2008, 20:00
califa010
 
Fecha de Ingreso: enero-2006
Ubicación: Buenos Aires, Argentina
Mensajes: 299
Antigüedad: 18 años, 4 meses
Puntos: 5
Respuesta: Mantener objeto entre diferentes visitas

Dependiendo de la complejidad que tenga el "estado" de este objeto (más allá de la compejidad o costo que implique crear ese "estado"), tal vez puedas guardarlo en la base de datos.

Entiendo que php permite serializar objetos, y de hecho es lo que pasa si guardás un objeto en una variable de sesión. Todos los datos se serializan y se guardan (los métodos, no); cuando se recupera ese objeto, se lo vuelve a crear (deserializando los datos previamente serializados). Si no hay de por medio referencias a recursos (como conexiones a bases de datos, archivos abiertos, etc), creo que en principio sería factible (la parte de los recursos no funciona porque cuando creás una conexión a una base de datos, por ejemplo, lo que guardás es una referencia a un recurso que se crea para ese script y al terminar su ejecución se destruye; esta referencia no es válida para otros scripts).

Más sobre este tema:
http://ar.php.net/manual/es/function.serialize.php
http://ar.php.net/manual/es/language...ialization.php

Una opción que se me ocurre podría ser tener una clase que maneje a este objeto, con un método getInstance() (como si fuera una especie de Singleton), que devolvería el objeto "costoso". Este método podría consultar si hay algún objeto "costoso" válido en la base de datos (tomando por válido cualquier objeto de menos de 24 hs de antigüedad, por ejemplo). En caso de haberlo, tomar esos datos para crear el nuevo objeto. En caso contrario, usar el método "costoso" de este objeto, obtener los datos y guardarlo en la base para la próxima vez.

Algo así (a grandes rasgos):

Código PHP:
class ManagerObjetoCostoso {
    
    private 
$objetoCostoso;
    
    public function 
getInstance() {
        
$datosSerializados $this->getFromDateBase();
        
        if(
$datosSerializados == NULL) {
            
$this->objetoCostoso = new ObjetoCostoso();
            
$this->objetoCostoso->obtenerDatos();
            
$this->saveToDataBase($this->objetoCostoso);
            
        } else {
            
            
$this->objetoCostoso unserialize($datosSerializados);
        
        }
        
        return 
$this->objetoCostoso;
    }
    
    private function 
saveToDataBase($obj) {
        
$datosSerializados serialize($obj);
        
//  guardar los datos en la base para la próxima consulta...
    
}
    
    private function 
getFromDateBase() {
        
//  hace un select de la base y devuelve los datos guardados si son válidos
        //  si no encuentra datos válidos, devuelve NULL
    
}
}

//
//  USO
//
$mgr = new ManagerObjetoCostoso();
$obj $mgr->getInstance(); 
Saludos
Juan Pablo Califano