PHP в файл конфигурации загрузчика класса


Я знаю, что это довольно простой класс для загрузки файла config в объект, а затем обращается к свойствам его. Я думаю, что настройки должны быть легкими и класса, как это, кажется, добавляет много накладных расходов, ИМО, но мне очень нравится быть в состоянии получить доступ к конфигурации свойства с $настройка->имя_свойства. Так Видите ли Вы возможности для улучшения? В основном улучшения производительности?

<?php
// config.class.php
/*
example usage
$config = Config::getInstance(PATH TO FILE, FILE TYPE);
echo $config->ip;
echo $config->db['host'];


example array file
<?php
return array( 
    'db' => array(
        'host' => 'localhost',
        'user' => 'user1',
        'pass' => 'mypassword'),

    'ip' => '123456',

)

*/   

class Config
{
    private static $_instance = null;
    public $options = array();

    /**
     * Retrieves php array file, json file, or ini file and builds array
     * @param $filepath Full path to where the file is located
     * @param $type is the type of file.  can be "ARRAY" "JSON" "INI"
     */ 
    private function __construct($filepath, $type = 'ARRAY')
    {
        switch($type) {
            case 'ARRAY':
                $this->options = include $filepath;
                break;

            case 'INI';
                $this->options = parse_ini_file($filepath, true);
                break;

            case 'JSON':
                $this->options = json_decode(file_get_contents($filepath), true);
                break;  

            //TO-DO add Database option for settings. Table = id, property, value
            case 'DATABASE':
                $this->options = json_decode(file_get_contents($filepath), true);
                break;     
        }
    }

    private function __clone(){}

    public static function getInstance($filepath, $type = 'ARRAY')
    {
        if (!isset(self::$_instance)) {
            self::$_instance = new self($filepath, $type);
        }
        return self::$_instance;
    }

    /**
     * Retrieve value with constants being a higher priority
     * @param $key Array Key to get
     */
    public function __get($key)
    {
        if (isset($this->options[$key])) {
            return $this->options[$key];
        }else{
            trigger_error("Key $val does not exist", E_USER_NOTICE);
        }
    }

    /**
     * Set a new or update a key / value pair
     * @param $key Key to set
     * @param $value Value to set
     */
    public function __set($key, $value)
    {
        $this->options[$key] = $value;
    }

}
?>


2374
4
php
задан 17 августа 2011 в 02:08 Источник Поделиться
Комментарии
1 ответ


В основном улучшения производительности?

Там, кажется, не быть много возможности для улучшения производительности. Этот класс в основном состоит из (1) погрузки и разбора конфигурации и (2) доступ к данным. Для погрузки, parse_ini_file и json_decode несколько встроенных методов, поэтому, если вы написать свой собственный парсер с нуля, вы не будете делать это быстрее. И доступ к данным в основном один проверяют состояние и подстановки массива, не так много, чтобы улучшить или.

Тем не менее, это разновидность внушения. Вы, вероятно, хотите, чтобы убедиться, что $FilePath в конструктор можно использовать только в определенных каталогах, например веб-корень или лучше, вложенной. Это также означает, что проверка на попытки вырваться из ограниченного каталога, например, $путь_к_файлу не имеет компонентов, как ../. Я легко могу представить себе атаки, при котором злоумышленник получает поставить пользовательские PHP-скрипт в каталоге/tmp , а затем (если у вас есть другие уязвимости в вашей другой код) умудряется назвать новый конфиг('/tmp/attack.php'). Тогда у вас есть произвольный сценарий maclicous выполнения с права на ваш сайт. Оуч.

3
ответ дан 17 августа 2011 в 12:08 Источник Поделиться