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