有没有一种方法可以重置特定类的所有静态属性?

15

静态属性使得测试变得困难,你可能已经知道了。有没有办法将一个特定类的所有静态属性重置回它们的初始状态?理想情况下,这不需要每个类的自定义代码,而是可以通过继承或完全从类外部使用。

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


1
你是否正在使用像PHPUnit这样的测试框架?这将在测试模块的设置/拆卸例程中得到处理。 - Bueller
3个回答

11

假设您正在使用PHPUnit:

请参阅PHPUnit手册中关于全局状态的部分。如果您使用PHP 5.3或更高版本,则会涵盖静态成员。静态成员不是序列化的一部分(如果您想知道的话)。

还可参阅@backupGlobals@backupStaticAttributes


2

不,PHP不会保留那些信息。

我在尝试使用ReflectionClass::getDefaultProperties::getStaticProperties时发现它们只返回当前状态。

您需要创建一个包含默认值的数组,然后手动对其进行foreach并重置类属性。


1
请注意:在修改静态属性之前必须调用getDefaultProperties以获取默认值。 - user142162

-1

我找不到任何方法可以多次包含或要求类或函数而不出错。

无论如何,如果您需要替换结构内的函数,则应创建一个 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');

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接