Имеется класс для хранения данных, к которому можно обратиться отовсюду. Убрал лишнюю логику, чтобы не напрягать мозг.
class Data {
static private $data;
/**
* Создать пустые объекты под переменные для удобства использовнаия
*/
public function __construct(){
self::$data['app'] = new \stdClass;
self::$data['cfg'] = new \stdClass;
self::$data['pkg'] = new \stdClass;
}
/**
* Сохранить переменную
*
* @param (string) $type Тип переменной (app|cfg|pkg)
* @param (array|object) $vars Массив/объект ключей и значений
*/
static public function set(string $type, $vars){
if(isset(self::$data[$type]) && (is_array($vars) or is_object($vars))){
foreach($vars as $key => $value){
self::$data[$type] -> $key = $value;
}
}
}
/**
* Получить переменную
*
* @param (string) $key Название
* @return (object)
*/
static public function get(string $type){
if(isset(self::$data[$type])){
return self::$data[$type];
}
throw new \Exception('Неизвестный тип переменной');
}
}
new Data;
// Сохраняем новую переменную
Data::set('app', ['foo' => 'bar']);
// Получаем список всех переменных типа "app"
$app = Data::get('app');
// Изменяем значение в текущей области видимости
$app -> foo = 'new value';
var_dump(Data::get('app') -> foo); // new value (WTF?)