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.
1 comentario:
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.
Publicar un comentario