php 函数中静态变量使用的问题实例分析


Posted in PHP onMarch 05, 2020

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

<?php
function msg() {
  static $a = 0;
  echo $a++, '<br />';
}

msg();
msg();
msg();

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

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

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

$data = array(
  array('id' => 1, 'title' => '衣服', 'parent' => 0),
  array('id' => 2, 'title' => '鞋子', 'parent' => 0),
  array('id' => 3, 'title' => '衬衫', 'parent' => 1),
  array('id' => 4, 'title' => 'T恤', 'parent' => 1),
  array('id' => 5, 'title' => '运动鞋', 'parent' => 2),
  array('id' => 6, 'title' => '休闲鞋', 'parent' => 2),
);

$data2 = array(
  array('id' => 1, 'title' => '食物', 'parent' => 0),
  array('id' => 2, 'title' => '肉食', 'parent' => 1),
  array('id' => 3, 'title' => '素食', 'parent' => 1),
  array('id' => 4, 'title' => '牛肉', 'parent' => 2),
  array('id' => 5, 'title' => '面条', 'parent' => 3),
  array('id' => 6, 'title' => '馒头', 'parent' => 3),
);

//生成树型数据
function genTree($items, $id = 'id', $pid = 'parent', $son = 'child') {
  $tree = array();
  $tmpMap = array();

  foreach ($items as $item) {
    $tmpMap[$item[$id]] = $item;
  }
  foreach ($items as $item) {
    if (isset($tmpMap[$item[$pid]])) {
      $tmpMap[$item[$pid]][$son][] = &$tmpMap[$item[$id]];
    } else {
      $tree[] = &$tmpMap[$item[$id]];
    }
  }
  unset($tmpMap);
  return $tree;
}

//通过给定数据,返回option的字符串,用于select下拉框
function getOpts($data, $idArr = array(), $level = 0, $son = 'child') {
  static $opt = '';
  if (!empty($data)) {
    foreach ($data as $k => $v) {
      $opt .= '<option value=' . $v['id'] . (in_array($v['id'], $idArr) ? ' selected="true"' : '') . '>' . str_repeat(' ', $level * 3) . $v['title'] . '</option>';
      if (!empty($v[$son])) {
        getOpts($v[$son], $idArr, $level + 1, $son);
      }
    }
  }
  return $opt;
}

$data = genTree($data);
echo '<select>';
//第一次调用getOpts时,没有任何问题。
echo getOpts($data);
echo '</select>';

$data2 = genTree($data2);
echo '<select>';
//当第二次调用时,问题就出现了,还留有上次的数据
echo getOpts($data2);
echo '</select>';

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

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

function getOpts($data, $idArr = array(), &$opt = '', $level = 0, $son = 'child') {
  if (!empty($data)) {
    foreach ($data as $k => $v) {
      $opt .= '<option value=' . $v['id'] . (in_array($v['id'], $idArr) ? ' selected="true"' : '') . '>' . str_repeat(' ', $level * 3) . $v['title'] . '</option>';
      if (!empty($v[$son])) {
        getOpts($v[$son], $idArr, $opt, $level + 1, $son);
      }
    }
  }
}

$data = genTree($data);
getOpts($data, array(), $opt);
echo '<select>';
echo $opt;
echo '</select>';

$data2 = genTree($data2);
getOpts($data2, array(), $opt2);
echo '<select>';
echo $opt2;
echo '</select>';

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
Discuz 6.0+ 批量注册用户名
Sep 13 PHP
解决文件名解压后乱码的问题 将文件名进行转码的代码
Jan 10 PHP
注册页面之前先验证用户名是否存在的php代码
Jul 14 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十三)
Jun 26 PHP
使用PHPExcel操作Excel用法实例分析
Mar 26 PHP
PHP实现事件机制的方法
Jul 10 PHP
WordPress主题制作之模板文件的引入方法
Dec 28 PHP
PHP加密解密类实例代码
Jul 20 PHP
深入浅析PHP的session反序列化漏洞问题
Jun 15 PHP
PHP基于redis计数器类定义与用法示例
Feb 08 PHP
PHP使用Curl实现模拟登录及抓取数据功能示例
Apr 27 PHP
PHP学习笔记之session
May 06 PHP
php多进程中的阻塞与非阻塞操作实例分析
Mar 04 #PHP
php 中的信号处理操作实例详解
Mar 04 #PHP
php libevent 功能与使用方法详解
Mar 04 #PHP
php+iframe 实现上传文件功能示例
Mar 04 #PHP
php实现文件上传基本验证
Mar 04 #PHP
PHP实现文件上传操作和封装
Mar 04 #PHP
PHP实现文件上传后台处理脚本
Mar 04 #PHP
You might like
PHPMailer邮件类利用smtp.163.com发送邮件方法
2008/09/11 PHP
PHP面向对象分析设计的61条军规小结
2010/07/17 PHP
基于jquery的使ListNav兼容中文首字拼音排序的实现代码
2011/07/10 Javascript
基于Jquery的文字自动截取(提供源代码)
2011/08/09 Javascript
ANT 压缩(去掉空格/注释)JS文件可提高js运行速度
2013/04/15 Javascript
浅析JavaScript基本类型与引用类型
2014/05/28 Javascript
js键盘事件的keyCode
2014/07/29 Javascript
鼠标悬浮显示二级菜单效果的jquery实现
2014/10/29 Javascript
Jquery时间轴特效(三种不同类型)
2015/11/02 Javascript
Markdown+Bootstrap图片自适应属性详解
2016/05/21 Javascript
AngularJS基础 ng-list 指令详解及示例代码
2016/08/02 Javascript
JS中定位 position 的使用实例代码
2017/08/06 Javascript
JS实现定时任务每隔N秒请求后台setInterval定时和ajax请求问题
2017/10/15 Javascript
vue实现前进刷新后退不刷新效果
2018/01/26 Javascript
Vue 中可以定义组件模版的几种方式
2019/08/06 Javascript
使用vuex较为优雅的实现一个购物车功能的示例代码
2019/12/09 Javascript
[42:48]完美世界DOTA2联赛PWL S3 Magma vs INK ICE 第二场 12.11
2020/12/16 DOTA
Python3基础之函数用法
2014/08/13 Python
深入理解NumPy简明教程---数组2
2016/12/17 Python
Python编程实现tail-n查看日志文件的方法
2019/07/08 Python
Python 使用 docopt 解析json参数文件过程讲解
2019/08/13 Python
python 进程间数据共享multiProcess.Manger实现解析
2019/09/23 Python
python re模块匹配贪婪和非贪婪模式详解
2020/02/11 Python
详解如何修改python中字典的键和值
2020/09/29 Python
手把手教你配置JupyterLab 环境的实现
2021/02/02 Python
CSS3 3D酷炫立方体变换动画的实现
2019/03/26 HTML / CSS
澳大利亚第一的设计师礼服租赁网站:GlamCorner
2017/08/13 全球购物
如何通过 CSS 写出火焰效果
2021/03/24 HTML / CSS
中学生获奖感言
2014/02/04 职场文书
《曹刿论战》教学反思
2014/03/02 职场文书
学校招生宣传广告词
2014/03/19 职场文书
2014年安全生产大检查方案
2014/05/13 职场文书
园林技术专业求职信
2014/07/28 职场文书
2014高三学生考试作弊检讨书
2014/12/14 职场文书
2019如何书写演讲稿?
2019/07/01 职场文书
Python的三个重要函数详解
2022/01/18 Python