Проблема с возвратом массива из включенного файла для конфигурации

Я пытаюсь сделать простой класс конфигурации для чтения массивов из файлов конфигурации. Где вы включаете файл, который имеет возвращаемое содержимое array(). Достаточно просто.

Я подумал, что немного расширю это, чтобы использовать точечную нотацию с первым элементом, являющимся именем файла. Но если вы попытаетесь получить доступ к данным в одном и том же файле дважды, он попытается включить файл во второй раз, что не работает.

public static function get($path=null,$ext='php'){
    if(!$path)return false;

    $path = explode('.',$path);
    $file = $path[0] . '.' . $ext;

    //remove file name.
    unset($path[0]);

    $files = scandir(CONFIG);

    if(in_array($file,$files)){

        $data = include_once(CONFIG.$file);

        foreach($path as $element){

            if(isset($data[$element])){

                $data = $data[$element];

            }
        }

        return $data;

    } else {

        return false;

    }

 }

Прекрасно работает до тех пор, пока вам больше ничего не понадобится из этого файла. Здесь есть простое исправление, или я полностью промок?

1 ответ

Вы должны просто сделать переменную кэша класса.. как:

public static $configData = array();

затем при вызове функции сначала проверьте, загружен ли файл конфигурации в configData. Так что при вызове функции, проверьте

if (!isset(self::$configData[$filename])) {
   ...load not loaded file and get some $configurationFromFile array..
   self::$configData[$filename] = $configurationFromFile
}

тогда после проверки все ли загружено

if (isset(self::$configData[$filename][$key]) {
  return self::$configData[$filename][$key];
} else {
  return false
}

поэтому вы никогда не будете пытаться сканировать этот каталог снова, если вы уже загрузили конфигурационный файл... он хорош для производительности... и производительность должна быть высокой для таких вещей, как получение конфигурации.

Другие вопросы по тегам