viernes, 11 de mayo de 2007

Guardar propiedades static en $_SESSION (III)

Como había dicho en mi anterior post, en éste veremos el API de Reflexión con el que viene provisto el PHP 5.

Nuestro primer contacto con este API lo hemos tenido cuando definíamos la función __getStatics(), recordemos:



static function __getStatics(){
$statics=array();
$reflejo=new ReflectionClass(__CLASS__);
$properties=$reflejo->getProperties();

foreach($properties as $p) if($p->isStatic() &&
$p->getDeclaringClass()->getName()===__CLASS__ ) {

$nombre=$p->getName();
$valor=self::$$nombre;
if(!is_resource($valor)) $statics[$nombre]=$valor;
}
return $statics;
}

Como vemos el API nos sirve para obtener información de las clases que hay definidas. En este caso obtenemos el objeto ReflectionClass que representa a la clase en la que está definido éste método. El método getProperties() nos devuelve todas las propiedades en un array de objetos ReflectionProperty que representa a cada una de las propiedades de la clase.

Este array nos devuelve TODAS las propiedades, incluso las heredadas, por lo que tenemos que hacer una criba y seleccionar únicamente aquellas que están declaradas directamente en la clase, que sean static y no sean un recurso (ya que no tiene sentido guardarlos de una ejecucion a otra).

Como habíamos dicho éste método debemos definirlo en todas aquellas clases en las que queramos mantener valores static de una ejecución a otra del script, ahora bien debemos ver como llamar a este método de una forma automatizada:
$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')));
}
}
}

Para cada una de las clases declaradas en el script comprobamos cuales de ellas tienen definido el método __getStatics (no heredado). Para cada una de esas clases se crea un objeto ClassStore al que se le pasan el array de valores de las propiedades static. Cada uno de estos objetos se guarda en $_SESSION["__statics"].

En el siguiente post veremos el objet ClassStore, que automatizará la recuperación de los datos de las propiedades static.

Ir a... [I][II][IV]

No hay comentarios: