VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > PHP >
  • php 函数中静态变量使用的问题实例分析

本文实例讲述了php 函数中静态变量使用的问题,分享给大家供大家参考,具体如下:

  1. <?php 
  2. function msg() { 
  3.   static $a = 0; 
  4.   echo $a++, '<br />'
  5.  
  6. msg(); 
  7. msg(); 
  8. msg(); 

上述代码,分别输出0,1,2 静态变量$a在第一次定义并初始化后就会常驻内存,直到脚本执行完毕。

当第二次调用msg()函数时,这时的$a值为1,而不会变成0。

那么问题来了,请看下面的一段代码:

  1. $data = array
  2.   array('id' => 1, 'title' => '衣服''parent' => 0), 
  3.   array('id' => 2, 'title' => '鞋子''parent' => 0), 
  4.   array('id' => 3, 'title' => '衬衫''parent' => 1), 
  5.   array('id' => 4, 'title' => 'T恤''parent' => 1), 
  6.   array('id' => 5, 'title' => '运动鞋''parent' => 2), 
  7.   array('id' => 6, 'title' => '休闲鞋''parent' => 2), 
  8. ); 
  9.  
  10. $data2 = array
  11.   array('id' => 1, 'title' => '食物''parent' => 0), 
  12.   array('id' => 2, 'title' => '肉食''parent' => 1), 
  13.   array('id' => 3, 'title' => '素食''parent' => 1), 
  14.   array('id' => 4, 'title' => '牛肉''parent' => 2), 
  15.   array('id' => 5, 'title' => '面条''parent' => 3), 
  16.   array('id' => 6, 'title' => '馒头''parent' => 3), 
  17. ); 
  18.  
  19. //生成树型数据 
  20. function genTree($items$id = 'id'$pid = 'parent'$son = 'child') { 
  21.   $tree = array(); 
  22.   $tmpMap = array(); 
  23.  
  24.   foreach ($items as $item) { 
  25.     $tmpMap[$item[$id]] = $item
  26.   } 
  27.   foreach ($items as $item) { 
  28.     if (isset($tmpMap[$item[$pid]])) { 
  29.       $tmpMap[$item[$pid]][$son][] = &$tmpMap[$item[$id]]; 
  30.     } else { 
  31.       $tree[] = &$tmpMap[$item[$id]]; 
  32.     } 
  33.   } 
  34.   unset($tmpMap); 
  35.   return $tree
  36.  
  37. //通过给定数据,返回option的字符串,用于select下拉框 
  38. function getOpts($data$idArr = array(), $level = 0, $son = 'child') { 
  39.   static $opt = ''
  40.   if (!emptyempty($data)) { 
  41.     foreach ($data as $k => $v) { 
  42.       $opt .= '<option value=' . $v['id'] . (in_array($v['id'], $idArr) ? ' selected="true"' : '') . '>' . str_repeat(' '$level * 3) . $v['title'] . '</option>'
  43.       if (!emptyempty($v[$son])) { 
  44.         getOpts($v[$son], $idArr$level + 1, $son); 
  45.       } 
  46.     } 
  47.   } 
  48.   return $opt
  49.  
  50. $data = genTree($data); 
  51. echo '<select>'
  52. //第一次调用getOpts时,没有任何问题。 
  53. echo getOpts($data); 
  54. echo '</select>'
  55.  
  56. $data2 = genTree($data2); 
  57. echo '<select>'
  58. //当第二次调用时,问题就出现了,还留有上次的数据 
  59. echo getOpts($data2); 
  60. echo '</select>'

上述问题,对于可能多次调用的函数,不建议在内部使用静态变量。

修改getOpts函数如下,从函数参数引入一个外部变量的引用,来解决此问题。

  1. function getOpts($data$idArr = array(), &$opt = ''$level = 0, $son = 'child') { 
  2.   if (!emptyempty($data)) { 
  3.     foreach ($data as $k => $v) { 
  4.       $opt .= '<option value=' . $v['id'] . (in_array($v['id'], $idArr) ? ' selected="true"' : '') . '>' . str_repeat(' '$level * 3) . $v['title'] . '</option>'
  5.       if (!emptyempty($v[$son])) { 
  6.         getOpts($v[$son], $idArr$opt$level + 1, $son); 
  7.       } 
  8.     } 
  9.   } 
  10.  
  11. $data = genTree($data); 
  12. getOpts($dataarray(), $opt); 
  13. echo '<select>'
  14. echo $opt
  15. echo '</select>'
  16.  
  17. $data2 = genTree($data2); 
  18. getOpts($data2array(), $opt2); 
  19. echo '<select>'
  20. echo $opt2
  21. echo '</select>';
  22.  

出处:http://www.phpfensi.com/php/20220218/19903.html


相关教程