lunes, 14 de mayo de 2007

Guardar propiedades static en $_SESSION (IV)

En esta tercera parte del artículo veremos la clase ClassStore.

Cada objeto ClassStore va a servir como un contenedor de las propiedades static de cada una de las clases utilizadas durante la ejecución del script. Todos estos objetos se van a guardar en un array indexado por el nombre de la clase: $_SESSION["__statics"][$nombre_de_la_clase]. El método estático __storeStatics (identico al código visto al final del último post) realiza estas acciones llamando a los métodos __getStatics() de las clases declaradas.


Para ello debemos hacer una lladama a __storeStatics cuando finalice la ejecución del script:

register_shutdown_function(array('ClassStore','__storeStatics'));

A continuación la clase ClassStore:

class ClassStore{
private $nombre;
private $statics;

function __construct($nombreClase,$statics){
$this->nombre=$nombreClase;
$this->statics=$statics;
}

function __wakeup(){
call_user_func(array($this->nombre,'__restoreStatics'),$this->statics);
}

static function __storeStatics(){
$classes=get_declared_classes();

foreach($classes as $name){
$reflejo=new ReflectionClass($name);

if($reflejo->hasMethod('__getStatics')){
$method=$reflejo->getMethod('__getStatics');

if($method->getDeclaringClass()->getName()===$name){

if(empty($_SESSION["__statics"]))
$_SESSION["__statics"]=array();

$_SESSION["__statics"][$name]=new ClassStore($name,call_user_func(array($name,'__getStatics')));

}
}
}
}
}

Si nos fijamos bien, cada vez que se recupere la sesion con session_start() el array $_SESSION se deserializa y se reconstruyen los objetos que guarda. Después de reconstruidos se llama al __wakeup de todos aquellos que lo tengan definido. De este modo cada unos de los objetos ClassStore devolverá a su valor anterior las propiedades static de cada una de las clases.

RECORDEMOS: en aquellas clases que queramos mantener estas propiedades debemos definir los métodos __getStatics y __restoreStatics como hemos visto. A continuación, en el script de cabecera, dónde tengamos el autoload de las clases y el session_start() registramos la llamada a la función __storeStatics para cuando finalice el script: register_shutdown_function(array('ClassStore','__storeStatics')). Y voilá, ya se mantienen las propiedades static.

Ir a... [I][II][III]

1 comentario:

Icarokun dijo...

Buenas macho, veo que estas hecho un fiera en PHP, un saludo de tu compi de clase y duro con el blog que yo tambien estoy a ver si reactivo el mio. Que no decaigan los posts que stan muy bien eh. Un abrazo.