2011-06-22 16 views
9

propiedades estáticas que el análisis sea duro como usted probablemente sabe. ¿No hay forma de restablecer todas las propiedades estáticas de una clase en particular a su estado inicial? Idealmente, esto no requeriría código personalizado para cada clase, pero podría usarse de forma general por herencia, o fuera de la clase por completo.¿Hay alguna manera de restablecer todas las propiedades estáticas de una clase en particular?

favor, no responda con algo como, "no utilice las propiedades estáticas". Gracias.

+1

¿Está utilizando un marco de prueba como PHPUnit? Esto se tendría en cuenta en las rutinas de configuración/desmontaje para un módulo de prueba. – Bueller

Respuesta

2

Nº PHP no conserva esa información.

Estaba jugando con ReflectionClass y ::getDefaultProperties y ::getStaticProperties, pero solo devuelven el estado actual.

Usted tendrá que crear una matriz con los valores por defecto, entonces manualmente foreach sobre ellos y restablecer los atributos de clase.

+1

Nota: 'getDefaultProperties' debe llamarse antes de las propiedades estáticas son modificados con el fin de obtener los valores por defecto. –

-1

no pude encontrar ninguna manera de incluir o requerir clases o funciones muchas veces sin obtener un error.

De todos modos, si es necesario reemplazar las funciones dentro de una estructura que debe hacer una gama/ArrayObject funciones de lamdas/línea (como JavaScript objetos)

Cuando vuelva a importar la matriz será de nuevo a el estado original.

$Animal = array(
    'eat' => function($food) {/*...*/}, 
    'run' => function($to_place) {/*...*/} 
); 
$Animal['eat'] = function($food) {/* new way to eat */} 

También lograron restablecer el estado de atributos estáticos mediante el uso de Reflexiones. Para este enfoque, debe usar un nombre de atributo de convención para el valor predeterminado de cada tipo.

class MyStaticHolder { 
    public static $x_array = array(); 
    public static $x_num = 0; 
    public static $x_str = ''; 
} 

//change values 
MyStaticHolder::$x_array = array(1,2,4); 
MyStaticHolder::$x_num = -1.4; 
MyStaticHolder::$x_str = 'sample-text'; 

function reset_static($class_name) { 
    $z = new ReflectionClass($class_name); 
    $properties = $z->getDefaultProperties(); 
    print_r($properties); 
    foreach ($properties as $property_name => $value) { 
     $sufix = end(explode('_',$property_name)); 
     switch ($sufix) { 
      case 'array': 
       $class_name::$$property_name = array(); 
       break; 
      case 'num': 
       $class_name::$$property_name = 0; 
       break; 
      case 'str': 
       $class_name::$$property_name = ''; 
       break; 
      default: 
       $class_name::$$property_name = null; 
       break; 
     } 
    } 
} 

reset_static('MyStaticHolder'); 
Cuestiones relacionadas