. * */ namespace Vvveb\System; class Config { private $config = []; private static $instance; public static function getInstance() { if (self::$instance) { return self::$instance; } else { return self::$instance = new self(); } } private function loadConfig($namespace) { //avoid checking file for non existing namespace if (isset($this->config[$namespace]) && $this->config[$namespace] === NULL) { return; } $file = DIR_ROOT . "config/$namespace.php"; if (file_exists($file)) { try { $this->config[$namespace] = include $file; } catch (\Exception $e) { } } else { $this->config[$namespace] = NULL; } } private function saveConfig($namespace) { $data = $this->config[$namespace]; $configFile = DIR_ROOT . "config/$namespace.php"; if ($error = file_put_contents($configFile, "config[$namespace])) { $this->loadConfig($namespace); if (! isset($this->config[$namespace])) { return null; } } $a = $this->config; while ($p !== false) { if (! isset($a[$p])) { return $default; } $a = $a[$p]; $p = strtok('.'); } return $a; } public function set($path, $value) { $p = strtok($path, '.'); $namespace = $p; if (! $namespace) { return false; } $a = &$this->config; //make sure the namespace is loaded to avoid overriding existing data if (! isset($this->config[$namespace])) { $this->loadConfig($namespace); } while ($p !== false) { if (! isset($a[$p])) { $a[$p] = []; } $prev = &$a; $last = $p; $a = &$a[$p]; $p = strtok('.'); } if (empty($a)) { $a = $value; } else { //if value already set go back one level if (! is_array($a)) { $prev[$last] = $value; } else { if (is_array($value)) { $a = array_merge($a, $value); } else { $a[$p] = $value; } } } return $this->saveConfig($namespace); } public function unset($path) { $p = strtok($path, '.'); $namespace = $p; if (! $namespace) { return false; } $a = &$this->config; //make sure the namespace is loaded to avoid overriding existing data if (! isset($this->config[$namespace])) { $this->loadConfig($namespace); } while ($p !== false) { if (! isset($a[$p])) { $a[$p] = []; } $prev = &$a; $last = $p; $a = &$a[$p]; $p = strtok('.'); } unset($prev[$last]); return $this->saveConfig($namespace); } }