Я не мог найти способ включить или потребовать классы или функции много раз без получения ошибки.
В любом случае, если вам нужно заменить функции внутри структуры, вы должны создать массив / 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');