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 相关文章推荐
php 获取可变函数参数的函数
Aug 26 PHP
PHP daddslashes 使用方法介绍
Oct 26 PHP
基于xcache的配置与使用详解
Jun 18 PHP
PHP可变变量学习小结
Nov 29 PHP
php构造函数与析构函数
Apr 23 PHP
通过chrome浏览器控制台(Console)进行PHP Debug的方法
Oct 19 PHP
php 多文件上传的实现实例
Oct 23 PHP
PHP实现双链表删除与插入节点的方法示例
Nov 11 PHP
PHP读取并输出XML文件数据的简单实现方法
Dec 22 PHP
php实现生成带二维码图片并强制下载功能
Feb 24 PHP
php在windows环境下获得cpu内存实时使用率(推荐)
Feb 08 PHP
PHP设计模式之 策略模式Strategy详解【对象行为型】
May 01 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
PHP4实际应用经验篇(1)
2006/10/09 PHP
浅析Apache中RewriteCond规则参数的详细介绍
2013/06/30 PHP
php版淘宝网查询商品接口代码示例
2014/06/17 PHP
PHP实现XML与数据格式进行转换类实例
2015/07/29 PHP
php Session无效分析资料整理
2016/11/29 PHP
给网站上的广告“加速”显示的方法
2007/04/08 Javascript
扩展jQuery 键盘事件的几个基本方法
2009/10/30 Javascript
基于JQuery的一句代码实现表格的简单筛选
2010/07/26 Javascript
$.format,jquery.format 使用说明
2011/07/13 Javascript
一个关于javascript匿名函数的问题分析
2012/03/30 Javascript
html+javascript实现可拖动可提交的弹出层对话框效果
2013/08/05 Javascript
jquery判断对象是否为空并遍历对象的简单实例
2016/07/26 Javascript
JS判断是否手机或pad访问实现方法
2016/12/09 Javascript
js实现复选框的全选和取消全选效果
2017/01/03 Javascript
进阶之初探nodeJS
2017/01/24 NodeJs
VS Code转换大小写、修改选中文字或代码颜色的方法
2017/12/15 Javascript
Vue 使用beforeEach实现登录状态检查功能
2019/10/31 Javascript
原生javascript制作的拼图游戏实现方法详解
2020/02/23 Javascript
详解Python time库的使用
2019/10/10 Python
python的等深分箱实例
2019/11/22 Python
Python学习笔记之装饰器
2020/08/06 Python
python3.5的包存放的具体路径
2020/08/16 Python
Python内置函数及功能简介汇总
2020/10/13 Python
css3背景_动力节点Java学院整理
2017/07/11 HTML / CSS
css3实现信纸/同学录效果的示例代码
2018/12/11 HTML / CSS
纯CSS3实现圆角效果(含IE兼容解决方法)
2014/05/07 HTML / CSS
详解html5 postMessage解决跨域通信的问题
2018/08/17 HTML / CSS
Linux管理员面试经常问道的相关命令
2013/04/29 面试题
消防安全员岗位职责
2014/03/10 职场文书
优质服务口号
2014/06/11 职场文书
党员批评与自我批评思想汇报(集锦)
2014/09/14 职场文书
完整版商业计划书
2014/09/15 职场文书
工作经历证明书范文
2014/11/02 职场文书
学校就业保障协议书
2019/06/24 职场文书
SpringBoot+VUE实现数据表格的实战
2021/08/02 Java/Android
24年收藏2000多部退役军用电台
2022/02/18 无线电