2011-06-22 14 views
9

Właściwości statyczne sprawiają, że testowanie jest trudne, jak zapewne wiesz. Czy nie ma sposobu, aby zresetować wszystkie właściwości statyczne danej klasy z powrotem do ich stanu początkowego? Najlepiej byłoby, gdyby nie wymagało to stosowania niestandardowego kodu dla każdej klasy, ale mogłoby być używane w sposób ogólny przez dziedziczenie lub całkowicie poza klasą.Czy istnieje sposób na zresetowanie wszystkich właściwości statycznych określonej klasy?

Nie odpowiadaj słowami "nie używaj właściwości statycznych". Dzięki.

+1

Czy używasz platformy testowej, takiej jak PHPUnit? Zostanie to uwzględnione w procedurach konfiguracji/rozpadu modułu testowego. – Bueller

Odpowiedz

2

Nie. PHP nie zachowuje tych informacji.

Bawiłem się przy pomocy ReflectionClass i ::getDefaultProperties i ::getStaticProperties, ale zwracają tylko bieżący stan.

Będziesz musiał utworzyć tablicę z wartościami domyślnymi, a następnie ręcznie przepytać i zresetować atrybuty klas.

+1

Uwaga: 'getDefaultProperties' MUSI zostać wywołane, zanim właściwości statyczne zostaną zmodyfikowane w celu uzyskania wartości domyślnych. –

-1

nie mogłem znaleźć żadnego sposobu na include lub require klasy lub funkcji wiele razy bez otrzymuję błąd.

W każdym razie, jeśli trzeba wymienić funkcje wewnątrz konstrukcji należy dokonać tablicę/ArrayObject funkcje z lamdas/inline (jak obiekty JavaScript)

Kiedy ponownie importować tablicę będzie go z powrotem do stan pierwotny.

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

I udało się również przywrócić stan atrybutów statycznych za pomocą Refleksje. W tym podejściu należy użyć nazwy atrybutu konwencji dla wartości domyślnej każdego typu.

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'); 
Powiązane problemy