Есть ли способ сбросить все статические свойства определенного класса? - PullRequest
9 голосов
/ 23 июня 2011

Статические свойства затрудняют тестирование, как вы, наверное, знаете. Нет ли способа вернуть все статические свойства определенного класса обратно в их исходное состояние? В идеале это не требует специального кода для каждого класса, но может использоваться общим способом по наследству или полностью вне класса.

Пожалуйста, не отвечайте что-то вроде "не используйте статические свойства". Спасибо.

Ответы [ 3 ]

7 голосов
/ 23 июня 2011

Если вы используете PHPUnit:

См. Руководство PHPUnit о глобальном состоянии . Статические члены покрываются этим, если у вас PHP 5.3 или выше. Статические члены не являются частью сериализации (если вам интересно).

См. Также @backupGlobals и @backupStaticAttributes

2 голосов
/ 23 июня 2011

Нет. PHP не сохраняет эту информацию.

Я играл с ReflectionClass, ::getDefaultProperties и ::getStaticProperties, но они возвращали только текущее состояние.

Вам нужно будет создать массив со значениями по умолчанию, затем вручную перейти к ним и сбросить атрибуты вашего класса.

0 голосов
/ 31 июля 2016

Я не мог найти способ включить или потребовать классы или функции много раз без получения ошибки.

В любом случае, если вам нужно заменить функции внутри структуры, вы должны создать массив / ArrayObject из функций lamdas / inline (например, объекты 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');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...