Привет всем и с Рождеством!
У меня проблемы с эффективностью, и я надеюсь, что сообщество 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;
}
Если результат 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;
}
Других решений пока нет …