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 相关文章推荐
第八节--访问方式
Nov 16 PHP
PHP Memcached + APC + 文件缓存封装实现代码
Mar 11 PHP
PHP生成excel时单元格内换行问题的解决方法
Aug 26 PHP
PHP开发中的错误收集,不定期更新。
Feb 03 PHP
PHP中extract()函数的妙用分析
Jul 11 PHP
php eval函数用法 PHP中eval()函数小技巧
Oct 31 PHP
php的sprintf函数的用法 控制浮点数格式
Feb 14 PHP
php实现获取文章内容第一张图片的方法
Nov 04 PHP
详解php中空字符串和0之间的关系
Oct 23 PHP
PHP文字转图片功能原理与实现方法分析
Aug 31 PHP
Laravel自动生成UUID,从建表到使用详解
Oct 24 PHP
php使用pthreads v3多线程实现抓取新浪新闻信息操作示例
Feb 21 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
php查询相似度最高的字符串的方法
2015/03/12 PHP
简单谈谈PHP中的include、include_once、require以及require_once语句
2016/04/23 PHP
javascript 保存文件到本地实现方法
2012/11/29 Javascript
jQuery老黄历完整实现方法
2015/01/16 Javascript
javascript实现九宫格相加数值相等
2020/05/28 Javascript
Ionic2系列之使用DeepLinker实现指定页面URL
2016/11/21 Javascript
js控制文本框禁止输入特殊字符详解
2017/04/07 Javascript
JavaScript数据结构中串的表示与应用实例
2017/04/12 Javascript
利用JS实现简单的瀑布流加载图片效果
2017/04/22 Javascript
vue实现app页面切换动画效果实例
2017/05/23 Javascript
mui框架移动开发初体验详解
2017/10/11 Javascript
详解Vue + Vuex 如何使用 vm.$nextTick
2017/11/20 Javascript
vue响应式系统之observe、watcher、dep的源码解析
2019/04/09 Javascript
JavaScript 截取字符串代码实例
2019/09/05 Javascript
谈谈JavaScript中的函数
2020/09/08 Javascript
[05:24]TI9采访——教练
2019/08/24 DOTA
Python2.7+pytesser实现简单验证码的识别方法
2017/12/29 Python
对python中的pop函数和append函数详解
2018/05/04 Python
python实现ip代理池功能示例
2019/07/05 Python
python3.7 使用pymssql往sqlserver插入数据的方法
2019/07/08 Python
python利用7z批量解压rar的实现
2019/08/07 Python
Django项目中使用JWT的实现代码
2019/11/04 Python
Python+Selenium随机生成手机验证码并检查页面上是否弹出重复手机号码提示框
2020/09/21 Python
Django正则URL匹配实现流程解析
2020/11/13 Python
对CSS3选择器的研究(详解)
2016/09/16 HTML / CSS
潘多拉珠宝美国官方网站:Pandora US
2020/06/18 全球购物
门诊手术室工作制度
2014/01/30 职场文书
关于元旦的广播稿
2014/02/16 职场文书
共产党员批评与自我批评
2014/10/15 职场文书
大学生违纪检讨书300字
2014/10/25 职场文书
2015大学迎新标语
2015/07/16 职场文书
2016年春季运动会广播稿
2015/08/19 职场文书
留学文书中的个人陈述,应该注意哪些问题?
2019/08/23 职场文书
python b站视频下载的五种版本
2021/05/27 Python
Spring Data JPA框架自定义Repository接口
2022/04/28 Java/Android
Python循环之while无限迭代
2022/04/30 Python