Если уже переписываете, то переписывайте нормально. Избавляйтесь от глобального массива $CONF, рекурсии и функций без неймспейсов. Также у вас функция как записывает так и читает значения, что немного выносит мозг. Также считаю что исключению там не место, лучше заменить на значение по умолчанию
class Config {
protected static array $register = [];
public static function get(string $name, $default = null) {
$keys = explode('.', $name);
$pointer = self::$register;
foreach ($keys as $key) {
if (!array_key_exists($key, $pointer)) {
/*Если ключа нет, выставить его*/
//self::set($name, $default);
/*Бросить исключение*/
//throw new Exception("No such key: {$name}");
/*Вернуть значение по умолчанию*/
return $default;
}
$pointer = &$pointer[$key];
}
return $pointer;
}
public static function set(string $name, $value = null) {
$arr = &self::$register;
$keys = explode('.', $name);
foreach ($keys as $key) {
$arr = &$arr[$key];
}
if (is_array($arr) && is_array($value)) {
$arr = array_replace_recursive($arr, $value);
} else {
$arr = $value;
}
}
public static function getTree() {
return self::$register;
}
}
Config::set("config", [
"name" => "test",
]);
print_r(Config::get("config"));
echo "(config)\n\n";
Config::set("config.class.name", "A");
print_r(Config::get("config.class.name"));
echo "\n(config.class.name)\n\n";
Config::set("config", [
"class" => [
"test" => "B",
],
]);
print_r(Config::get("config.class"));
echo "\n(config.class)\n\n";
Config::set("config.class", null);
print_r(Config::get("config.class"));
echo "\n(config.class)\n\n";
print_r(Config::get("config.fake.key.without.value", "UNDEFINED"));
echo "\n(config.fake.key.without.value)\n\n";
Config::set("config.nullable", null);
print_r(Config::get("config.nullable", "NULL"));
echo "\n(config.nullable)\n\n";
print_r(Config::getTree());
echo "\n(all)\n";
Работает в PHP7.4