база данных — Хранение данных в статическом классе [PHP]

Привет всем и с Рождеством!

У меня проблемы с эффективностью, и я надеюсь, что сообщество StackOverflow поможет мне.

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

private static function makeArray(){
// grab information from database and format array here
return $array;
}

public static function doSomething(){
$data = self::makeArray();
return $data->stuff;
}

public static function doSomethingElse(){
$data = self::makeArray();
return $data->stuff->moreStuff;
}

6

Решение

Если результат makeArray() не ожидается изменений во время одного запуска вашего скрипта, рассмотрите возможность кэширования его результата в свойстве статического класса после первого извлечения. Для этого проверьте, является ли переменная пустой. Если это так, выполните действие с базой данных и сохраните результат. Если не пусто, просто верните существующий массив.

// A static property to hold the array
private static $array;

private static function makeArray() {
// Only if still empty, populate the array
if (empty(self::$array)) {
// grab information from database and format array here
self::$array = array(...);
}
// Return it - maybe newly populated, maybe cached
return self::$array;
}

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

// Add a boolean param (default false) to force fresh data
private static function makeArray($fresh = false) {
// If still empty OR the $fresh param is true, get new data
if (empty(self::$array) || $fresh) {
// grab information from database and format array here
self::$array = array(...);
}
// Return it - maybe newly populated, maybe cached
return self::$array;
}

Все остальные ваши методы класса могут продолжать вызывать self::makeArray() как вы уже сделали.

public static function doSomething(){
$data = self::makeArray();
return $data->stuff;
}

Если вы добавили необязательный параметр fresh и хотите принудительно извлечь данные из базы данных

public static function doSomething(){
// Call normally (accepting cached values if present)
$data = self::makeArray();
return $data->stuff;
}
public static function doSomethingRequiringRefresh(){
// Call with the $fresh param true
$data = self::makeArray(true);
return $data->stuff;
}
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]