静态属性使您可能知道测试很难。有没有办法将特定类的所有静态属性重置回其初始状态?理想情况下,这不需要每个类的自定义代码,但可以通过继承或完全从类外部以一般方式使用。
请不要回复“不要使用静态属性”之类的内容。感谢。
答案 0 :(得分:7)
假设你正在使用PHPUnit:
请参阅PHPUnit手册section about global state。如果您使用PHP 5.3或更高版本,则静态成员将受此限制。静态成员不是序列化的一部分(如果你想知道)。
答案 1 :(得分:2)
没有。 PHP不保留该信息。
我正在玩ReflectionClass
和::getDefaultProperties
以及::getStaticProperties
,但他们只返回当前状态。
您必须创建一个包含默认值的数组,然后手动预约它们并重置您的类属性。
答案 2 :(得分:-1)
我无法找到任何方法来多次包含或要求类或函数而不会出错。
无论如何,如果你需要替换一个结构中的函数,你应该创建 lamdas / inline函数的数组/ ArrayObject (比如javascript对象)
重新导入数组时,它将恢复到原始状态。
$Animal = array(
'eat' => function($food) {/*...*/},
'run' => function($to_place) {/*...*/}
);
$Animal['eat'] = function($food) {/* new way to eat */}
我还设法通过 Reflections 重置静态属性的状态。对于此方法,您需要使用约定属性命名为每种类型的默认值。
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');