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 相关文章推荐
在Zeus Web Server中安装PHP语言支持
Oct 09 PHP
使用sockets:从新闻组中获取文章(二)
Oct 09 PHP
安装PHP可能遇到的问题“无法载入mysql扩展” 的解决方法
Apr 16 PHP
php摘要生成函数(无乱码)
Feb 04 PHP
解析php中heredoc的使用方法
Jun 17 PHP
php判断是否为json格式的方法
Mar 04 PHP
ThinkPHP使用smarty模板引擎的方法
Jul 01 PHP
PHP性能分析工具XHProf安装使用教程
May 13 PHP
WordPress中查询文章的循环Loop结构及用法分析
Dec 17 PHP
浅析Yii2集成富文本编辑器redactor实例教程
Apr 25 PHP
微信支付开发交易通知实例
Jul 12 PHP
PHP实现二叉树深度优先遍历(前序、中序、后序)和广度优先遍历(层次)实例详解
Apr 20 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
《DOTA3》开发工作已经开始 《DOTA3》将代替《DOTA2》
2021/03/06 DOTA
php出现Cannot modify header information问题的解决方法大全
2008/04/09 PHP
PHP 第二节 数据类型之数值型
2012/04/28 PHP
php+curl 发送图片处理代码分享
2015/07/09 PHP
PHP搭建大文件切割分块上传功能示例
2017/01/04 PHP
PHP MVC框架中类的自动加载机制实例分析
2019/09/18 PHP
JavaScript Event学习第二章 Event浏览器兼容性
2010/02/07 Javascript
extjs 04_grid 单击事件新发现
2012/11/27 Javascript
js实现仿MSN带关闭功能的右下角弹窗代码
2015/09/04 Javascript
JavaScript如何动态创建table表格
2020/08/02 Javascript
js去字符串前后空格的实现方法
2016/02/26 Javascript
Bootstrap下拉菜单效果实例代码分享
2016/06/30 Javascript
玩转NODE.JS(四)-搭建简单的聊天室的代码
2016/11/11 Javascript
详解jQuery中的事件
2016/12/14 Javascript
canvas实现粒子时钟效果
2017/02/06 Javascript
第一次记录Bootstrap table学习笔记(1)
2017/05/18 Javascript
vue父子组件的嵌套的示例代码
2017/09/08 Javascript
webpack搭建vue 项目的步骤
2017/12/27 Javascript
详解Vue项目编译后部署在非网站根目录的解决方案
2018/04/26 Javascript
JS引用传递与值传递的区别与用法分析
2018/06/01 Javascript
JS/HTML5游戏常用算法之路径搜索算法 A*寻路算法完整实例
2018/12/14 Javascript
element-ui table span-method(行合并)的实现代码
2018/12/20 Javascript
vue-router二级导航切换路由及高亮显示的实现方法
2019/07/10 Javascript
JS实现音乐钢琴特效
2020/01/06 Javascript
JavaScript享元模式原理与用法实例详解
2020/03/09 Javascript
深入浅析python继承问题
2016/05/29 Python
《Python学习手册》学习总结
2018/01/17 Python
python实现发送form-data数据的方法详解
2019/09/27 Python
安装2019Pycharm最新版本的教程详解
2019/10/22 Python
解决pycharm中的run和debug失效无法点击运行
2020/06/09 Python
Python私有属性私有方法应用实例解析
2020/09/15 Python
New Balance法国官方网站:购买鞋子和服装
2019/09/01 全球购物
高中军训感言600字
2014/03/11 职场文书
工商局个人工作总结
2015/03/03 职场文书
swagger如何返回map字段注释
2021/07/03 Java/Android
vue配置型表格基于el-table拓展之table-plus组件
2022/04/12 Vue.js