有没有办法重置特定类的所有静态属性?

时间:2011-06-22 23:52:54

标签: php static phpunit

静态属性使您可能知道测试很难。有没有办法将特定类的所有静态属性重置回其初始状态?理想情况下,这不需要每个类的自定义代码,但可以通过继承或完全从类外部以一般方式使用。

请不要回复“不要使用静态属性”之类的内容。感谢。

3 个答案:

答案 0 :(得分:7)

假设你正在使用PHPUnit:

请参阅PHPUnit手册section about global state。如果您使用PHP 5.3或更高版本,则静态成员将受此限制。静态成员不是序列化的一部分(如果你想知道)。

另请参阅@backupGlobals@backupStaticAttributes

答案 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');