静态属性使得测试变得困难,你可能已经知道了。有没有办法将一个特定类的所有静态属性重置回它们的初始状态?理想情况下,这不需要每个类的自定义代码,而是可以通过继承或完全从类外部使用。
请不要回复像“不要使用静态属性”之类的内容。谢谢。
假设您正在使用PHPUnit:
请参阅PHPUnit手册中关于全局状态的部分。如果您使用PHP 5.3或更高版本,则会涵盖静态成员。静态成员不是序列化的一部分(如果您想知道的话)。
不,PHP不会保留那些信息。
我在尝试使用ReflectionClass
、::getDefaultProperties
和::getStaticProperties
时发现它们只返回当前状态。
您需要创建一个包含默认值的数组,然后手动对其进行foreach并重置类属性。
getDefaultProperties
以获取默认值。 - user142162我找不到任何方法可以多次包含或要求类或函数而不出错。
无论如何,如果您需要替换结构内的函数,则应创建一个 lamdas/inline functions(类似于javascript对象)的数组/ArrayObject。
当您重新导入数组时,它将返回到原始状态。
$Animal = array(
'eat' => function($food) {/*...*/},
'run' => function($to_place) {/*...*/}
);
$Animal['eat'] = function($food) {/* new way to eat */}
我还通过使用反射成功地重置了静态属性的状态。对于这种方法,您需要使用默认值每种类型的约定属性命名。
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');