2011-06-22 8 views
9

Statik özellikler, muhtemelen bildiğiniz gibi testleri zorlaştırır. Belli bir sınıfın tüm statik özelliklerini ilk durumuna geri sıfırlamanın bir yolu yok mu? İdeal olarak bu, her bir sınıf için özel kod gerektirmez, ancak kalıtım yoluyla veya sınıfın tamamı tarafından genel olarak kullanılabilir.Belirli bir sınıfın tüm statik özelliklerini sıfırlamanın bir yolu var mı?

Lütfen "statik özellikleri kullanma" gibi bir şeyle yanıt vermeyin. Teşekkürler.

+1

PHPUnit gibi bir test çerçevesi kullanıyor musunuz? Bu, bir test modülü için kurulum/devrilme rutinlerinde dikkate alınacaktır. – Bueller

cevap

2

Hayır. PHP bu bilgileri korumaz.

ReflectionClass ve ::getDefaultProperties ve ::getStaticProperties ile etrafta dolaşıyordum, ancak yalnızca geçerli durumu döndürüyorlar.

Varsayılan değerler içeren bir dizi oluşturmanız, ardından bunları el ile oluşturmanız ve sınıf özelliklerinizi sıfırlamanız gerekir.

+1

Not: Varsayılan değerler elde etmek için statik özellikler değiştirilmeden önce 'getDefaultProperties' denenmesi gerekir. –

-1

ben dahil veya bir hata almadan sınıfları veya fonksiyonları defalarca gerektirecek herhangi bir şekilde bulamadık bakın. Bir yapının içinde işlevlerini yerine gerekiyorsa

Neyse, bunu geri dönecektir dizi içe olduğun zaman (javascript nesneler gibi) bir dizi/DiziNesnesiait lamdas/inline fonksiyonlar

yapmalıdır orijinal hal.

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

Ben de Yansımalar kullanarak statik özelliklerin durumunu sıfırlamak başardı. Bu yaklaşım için, her türün varsayılan değeri için bir kural özniteliği adı kullanmanız gerekir.

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'); 
İlgili konular