【问题标题】:Static Variables in Function after while loopwhile循环后函数中的静态变量
【发布时间】:2011-08-15 20:11:02
【问题描述】:

我在 CMS 中有一个数据库抽象层,其中一个功能是 mysql_fetch_assoc 包装器,它将连接、查询和结果逻辑合二为一。

_select_row($in_table, $in_what = '*', $in_where = '', 
            $in_arr_params = array(), $in_flags)
{
  // Generates a unique enough name based on query contents.
  $hash = md5($in_table.$in_what.implode((array)$in_arr_params).$in_flags);

  if (!isset($_STATIC))
  {
    static $_STATIC = array();
  }

  if (isset($_STATIC[$hash])
  {
    return mysql_fetch_assoc($_STATIC[$hash]);
  }

  // *snip* SQL logic here, connect -> query -> result *snip*

  $_STATIC[$hash] = $result;
  return mysql_fetch_assoc($_STATIC[$hash]);
}

它维护一个静态变量,因此在循环中使用时,它可以像标准的 fetch_assoc 调用一样进行迭代。

while (_select_row('mytable')) // Loops all rows
{
  // Do Stuff
}

我遇到的唯一问题是一个极端情况:如果程序员稍后尝试在脚本中再次进行相同的查询,它将继续迭代而不是重新开始。我可以创建某种重置函数,或者使用选择器函数和结果函数,但我希望有一个更优雅的解决方案,其中该函数将“知道”何时不在同一个循环中调用,并且转储结果。另外,为了提高效率,我希望它在完成后转储结果。

有什么想法,或者切换到选择->结果模型真的是解决这个问题的唯一方法吗?

【问题讨论】:

  • 传入一个参数说“不使用缓存结果”?
  • if (!isset($_STATIC)) 有点违背静态变量的目的。你可以跳过这个。

标签: php mysql static


【解决方案1】:

出于这种原因,静态通常不是一个好主意。

只需传入一个额外参数,作为对每次迭代时由函数更新的“状态”结构的引用。

如果你想更进一步,你可以将函数封装在一个类中,这样可以维护状态。

【讨论】:

    【解决方案2】:

    您可以在函数中添加一个布尔重置标志来指示它是否要重置:

    _select_row($in_table, /* snip a bunch of params */, $reset=FALSE)
    {
      // Generates a unique enough name based on query contents.
      $hash = md5($in_table.$in_what.implode((array)$in_arr_params).$in_flags);
    
      if (!isset($_STATIC))
      {
        static $_STATIC = array();
      }
    
      if (isset($_STATIC[$hash])
      {
        return mysql_fetch_assoc($_STATIC[$hash]);
      }
    
      // *snip* SQL logic here, connect -> query -> result *snip*
    
      $_STATIC[$hash] = $result;
      ////////////////////////////////////////////////////
      // If this is a reset, set position to 0
      if ($reset) mysql_data_seek($_STATIC[$hash], 0);
      ////////////////////////////////////////////////////
    
      return mysql_fetch_assoc($_STATIC[$hash]);
    }
    

    【讨论】:

      【解决方案3】:

      我知道你想要优雅,但你可以使用 debug_backtrace() 来确定它是从哪里调用的。

      【讨论】:

      • 函数的内部不优雅并不是那么糟糕,我正在寻找的优雅是使用函数。就像 jQuery 对特定浏览器有一些丑陋的 hack(看着你的 IE),但它的实际使用是优雅的。尽管如果在子循环中使用该语句,则回溯可能会产生相同的结果;这也可能是预期的行为。不过,我将研究这种方法,它显示出一些希望。
      猜你喜欢
      • 1970-01-01
      • 2014-01-17
      • 2021-02-24
      • 2015-06-11
      • 2017-09-30
      • 1970-01-01
      • 2019-09-06
      • 1970-01-01
      • 2022-07-07
      相关资源
      最近更新 更多