【问题标题】:Storing data in a static class [PHP]在静态类中存储数据 [PHP]
【发布时间】:2016-03-31 18:57:12
【问题描述】:

大家好,圣诞快乐!

我在效率方面遇到了一些问题,我希望 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() 的结果在每次调用时总是相同吗?如果是这样,您可以将其缓存在静态属性中,如果已填充则返回。
  • 如果数据库中的数据被更新(这种情况不会经常发生并且是手动完成的),那么它将改变 makeArray() 的结果,因此缓存它可能是一个不错的选择。你会建议我如何缓存这样的结果?

标签: php database class persistent static-classes


【解决方案1】:

如果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;
}

如果您添加了可选的新鲜参数并希望强制从数据库中检索

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;
}

【讨论】:

    猜你喜欢
    • 2012-08-22
    • 1970-01-01
    • 2011-11-22
    • 1970-01-01
    • 2017-02-19
    • 2013-10-15
    • 1970-01-01
    • 2014-06-13
    • 1970-01-01
    相关资源
    最近更新 更多