while循环后函数中的静态变量

时间:2011-08-15 20:11:03

标签: php mysql static

我在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
}

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

任何想法,或者转向选择>结果模型真的是解决这个问题的唯一方法吗?

3 个答案:

答案 0 :(得分:0)

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

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

如果你想获得高级,你可以将该函数包装在一个维持状态的类中。

答案 1 :(得分:0)

您可以向函数添加布尔重置标志,以指示是否要重置:

_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]);
}

答案 2 :(得分:0)

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