Класс Config своими руками.

Arlevnar

Новичок
Доброго времени суток. Речь идёт о велосипеде.

Создал класс для работы с конфигурационными файлами. И хотел бы узнать что думают спецы о такой конструкции.

PHP:
<?php
class Config {
    
    /**
     * Path to configuration files
     * 
     * @var str 
     */
    private $path;
    
    /**
     * Extending the configuration files
     * 
     * @var str 
     */
    private $ext;
    
    
    public function __construct($dirpath, $ext='.php')
    {
        $this->path = $dirpath;
        $this->ext  = $ext;
        return $this;
    }
    
    public function set_path($dirpath)
    {
        $this->path = $dirpath;
    }
    
    private function parse($str)
    {
        $result['path'] = $this->path.substr($str, 0, strpos($str, '.', 0)).$this->ext;
        $result['keys'] = '[\''.str_replace('.','\'][\'',substr($str, strpos($str, '.', 0) + 1)).'\']';
        
        return $result; 
    }
    
    public function get($path)
    {
        $var = $this->parse($path);
        
        if (!file_exists($var['path'])) {
            throw new Exception("Файл `".$var['path']."` не найден");
        }
        
        $data = (array) include($var['path']); 
        
        if (!is_array($data)) {
            throw new Exception("Данные не найдены");
        }
        
        eval('$is = isset($data'.$var['keys'].');');
        
        if (!$is) {
            throw new Exception("Данные не найдены");
        } 
        
        eval('$result = $data'.$var['keys'].';');
        
        return $result;
    }
}
 

tz-lom

Продвинутый новичок
если пишешь PHPDoc - пиши для всего
в parse я бы использовал explode
если читать много параметров из одного файла - будет много подключений этого файла, данные надо кешировать
eval не нужен

вообще сам класс фиговый и только создаёт трудности и тормоза,ничего не давая в замен
 

Arlevnar

Новичок
Кешировать? А на сколько безопасно кеширование? Честно говоря базовые знания конечно имеются но на практике особо не применял. Привык так сказать к готовым решениям. А тут захотелось самому реализовать. Если не сложно не могли бы вы поделится знаниями о кешировании?
 

Вурдалак

Продвинутый новичок
Безусловно, я не спец, но тут нет абстракции. Либо должны быть разные типы конфигов (Config_Php, Config_Xml, Config_Yaml, ...) реализующие общий интерфейс или унаследованные от общего абстрактного класса, либо нужно вынести получение самого массива с данными в отдельный класс (Loader_Php, Loader_Xml, ...).

Та же хрень без eval'а:
PHP:
function get($data, $key)
{
    $current = &$data;
    
    foreach(explode('.', $key) as $subkey)
    {
        if( is_array($current) && isset($current[$subkey]) )
        {
            $current = &$current[$subkey];
        }
        else
        {
            throw new UnexpectedValueException(/* ... */);
        }
    }
    
    return $current;
}
 

Arlevnar

Новичок
Но неужели конструкция с циклом сработает быстрее чем с eval()? eval же толком нече тут не делает.
И ещё хотел спросить а как правильно кешировать данные в данном контексте.
 

AmdY

Пью пиво
Команда форума
Arlevnar
а ты пройдись по своему коду, задавая себе вопрос, что в этой строчке делается и действительно ли это так необходимо.
 

fixxxer

К.О.
Партнер клуба
Но неужели конструкция с циклом сработает быстрее чем с eval()? eval же толком нече тут не делает.
Предлагаю тебе подумать над тем, что делает eval. Можешь посмотреть в исходниках, если базовых знаний о внутреннем устройстве компилирующих в байткод интерпретаторов не хватает.
 

shelestov

я тут часто
А зачем return в конструкторе. Разьве он не void должен быть?
И я бы сделал конфиг как Singleton, тоесть один объект конфига, с возможностью добавлять в него различные конфигурации, например Config::load();
 

Adelf

Administrator
Команда форума
PHP:
class Config
{
    protected $values = array();

    public function __construct($path)
    {
        $configFilePath = CONFIG_PATH.$path.'.php'; // можно и на константу заменить если надо
        if(file_exists($configFilePath))
            $this->values = include $configFilePath;
    }

    public function get($key)
    {
        return isset($this->values[$key]) ? $this->values[$key] : null;
    }
}
Для класса конфига простого проекта - этого хватило бы за глаза. Для сложных - в каждом фреймворке есть свой вариант. Так что... не вижу смысла усложнять.
 

Духовность™

Продвинутый новичок
Я вообще не понимаю, зачем нужны конфиги. В классах можно объявлять настройки как свойства. Все, что относится к title и пр - выносить в i18n
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
данные для коннекта к бд ты тоже будешь прописывать в свойства?)
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Абсолютно все не запихнуть в бутстрап, я например юзаю конфиги с точечной нотацией в виде app.mysql.connection.hostname. Весьма удобно.
 
  • Like
Реакции: KorP

Arlevnar

Новичок
А зачем return в конструкторе. Разьве он не void должен быть?
И я бы сделал конфиг как Singleton, тоесть один объект конфига, с возможностью добавлять в него различные конфигурации, например Config::load();
Логично. Но хочется как бы так сказать по макисмум минимизировать конструкцию вызова. Так же хочется потратить по минимуму ресурсов на реализацию вызова.
 

Arlevnar

Новичок
PHP:
class Config
{
    protected $values = array();

    public function __construct($path)
    {
        $configFilePath = CONFIG_PATH.$path.'.php'; // можно и на константу заменить если надо
        if(file_exists($configFilePath))
            $this->values = include $configFilePath;
    }

    public function get($key)
    {
        return isset($this->values[$key]) ? $this->values[$key] : null;
    }
}
Для класса конфига простого проекта - этого хватило бы за глаза. Для сложных - в каждом фреймворке есть свой вариант. Так что... не вижу смысла усложнять.
А как быть в ситуации если носитель конфигурационной информации не один. То есть скажем файлов океан. Каждый раз прописывать два параметра в метод не элегантно.

А потом держать в памяти лишний массив. Тогда уж прще в такой вариации пробежатся по всем файлам в базовой директории конфигураций и отправить их в сессию. Что бы каждый раз не использовать конструкцию include при запросе.
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
На данный момент 6 отличных друг от друга конфигов, часть инфы смержена в один большой application.php конфиг.
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Вызов данных с конфиг файлов?
 
Сверху