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 相关文章推荐
隐藏X-Space个人空间下方版权方法隐藏X-Space个人空间标题隐藏X-Space个人空间管理版权方法
Feb 22 PHP
php 格式化数字的时候注意数字的范围
Apr 13 PHP
apache mysql php 源码编译使用方法
May 03 PHP
php读取3389的脚本
May 06 PHP
php include类文件超时问题处理
Feb 06 PHP
PHP安装memcached扩展笔记
May 28 PHP
PHP实现的QQ空间g_tk加密算法
Jul 09 PHP
Zend Framework教程之配置文件application.ini解析
Mar 10 PHP
PHP入门教程之数学运算技巧总结
Sep 11 PHP
tp5(thinkPHP5)框架实现多数据库查询的方法
Jan 10 PHP
PHP中检查isset()和!empty()函数的必要性
Feb 13 PHP
PHP反射学习入门示例
Jun 14 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中的explode()函数实例介绍
2019/01/18 PHP
Javascript打印网页部分内容的脚本
2008/11/17 Javascript
jquery 输入框数字限制插件
2009/11/10 Javascript
基于jquery实现的上传图片及图片大小验证、图片预览效果代码
2011/04/12 Javascript
使用jquery获取网页中图片高度的两种方法
2013/09/26 Javascript
自定义ExtJS控件之下拉树和下拉表格附源码
2013/10/15 Javascript
jQuery中removeClass()方法用法实例
2015/01/05 Javascript
举例讲解JavaScript中将数组元素转换为字符串的方法
2015/10/25 Javascript
JS实现异步上传压缩图片
2017/04/22 Javascript
微信小程序中页面FOR循环和嵌套循环
2017/06/21 Javascript
vue2.0实现移动端的输入框实时检索更新列表功能
2018/05/08 Javascript
javascript的this关键字详解
2019/05/20 Javascript
jquery实现简易验证插件封装
2020/09/13 jQuery
python连接池实现示例程序
2013/11/26 Python
python 识别图片中的文字信息方法
2018/05/10 Python
Python time库基本使用方法分析
2019/12/13 Python
python构造函数init实例方法解析
2020/01/19 Python
基于Tensorflow:CPU性能分析
2020/02/10 Python
在Mac中配置Python虚拟环境过程解析
2020/06/22 Python
挪威户外活动服装和装备购物网站:Bergfreunde挪威
2016/10/20 全球购物
美国最好的葡萄酒网上商店:Wine Library
2019/11/02 全球购物
全球采购的街头服饰和帽子:Urban Excess
2020/10/28 全球购物
.net C#面试题
2012/08/28 面试题
毕业生自我鉴定
2013/12/04 职场文书
煤矿班组长竞聘书
2014/03/31 职场文书
安全宣传标语口号
2014/06/06 职场文书
2014审计局领导班子民主生活会对照检查材料思想汇报
2014/09/20 职场文书
优秀班组事迹材料
2014/12/24 职场文书
工地材料员岗位职责
2015/04/11 职场文书
虎兄虎弟观后感
2015/06/12 职场文书
好人好事新闻稿
2015/07/17 职场文书
公司岗位说明书
2015/10/08 职场文书
2019年鼓励无偿献血倡议书
2019/09/17 职场文书
如何在Python中创建二叉树
2021/03/30 Python
常用的Python代码调试工具总结
2021/06/23 Python
redis lua限流算法实现示例
2022/07/15 Redis