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连mysql和oracle数据库性能比较
Oct 09 PHP
NO3第三帝国留言簿制作过程
Oct 09 PHP
php之字符串变相相减的代码
Mar 19 PHP
php除数取整示例
Apr 24 PHP
PHP的error_reporting错误级别变量对照表
Jul 08 PHP
初识php MVC
Sep 10 PHP
了解PHP的返回引用和局部静态变量
Jun 04 PHP
CodeIgniter多语言实现方法详解
Jan 20 PHP
orm获取关联表里的属性值
Apr 17 PHP
Yii2中多表关联查询hasOne hasMany的方法
Feb 15 PHP
PHP实现大数(浮点数)取余的方法
Feb 18 PHP
PHP新手指南
Apr 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
5.PHP的其他功能
2006/10/09 PHP
PHP 函数语法介绍一
2009/06/14 PHP
基于header的一些常用指令详解
2013/06/06 PHP
在Yii2特定页面如何禁用调试工具栏Debug Toolbar详解
2017/08/07 PHP
Yii框架模拟组件调用注入示例
2019/11/11 PHP
如何用javascript判断录入的日期是否合法
2007/01/08 Javascript
jQuery each()小议
2010/03/18 Javascript
High Performance JavaScript(高性能JavaScript)读书笔记分析
2011/05/05 Javascript
js获取时间(本周、本季度、本月..)
2013/11/22 Javascript
js+canvas绘制五角星的方法
2016/01/28 Javascript
Angular2库初探
2017/03/01 Javascript
详解Angular 中 ngOnInit 和 constructor 使用场景
2017/06/22 Javascript
在Vue.js中使用Mixins的方法
2017/09/12 Javascript
Vue下滚动到页面底部无限加载数据的示例代码
2018/04/22 Javascript
Postman的下载及安装教程详解
2018/10/16 Javascript
vue.js 2.*项目环境搭建、运行、打包发布的详细步骤
2019/05/01 Javascript
node.js中process进程的概念和child_process子进程模块的使用方法示例
2020/02/11 Javascript
Bootstrap table 服务器端分页功能实现方法示例
2020/06/01 Javascript
Vue中component标签解决项目组件化操作
2020/09/04 Javascript
python 实现红包随机生成算法的简单实例
2017/01/04 Python
使用Pyinstaller的最新踩坑实战记录
2017/11/08 Python
Pycharm代码无法复制,无法选中删除,无法编辑的解决方法
2018/10/22 Python
Jupyter notebook在mac:linux上的配置和远程访问的方法
2019/01/14 Python
python多线程http压力测试脚本
2019/06/25 Python
基于Python实现简单学生管理系统
2020/07/24 Python
Python hashlib模块的使用示例
2020/10/09 Python
Selenium 安装和简单使用的实现
2020/12/04 Python
HTML5新增的Css选择器、伪类介绍
2013/08/07 HTML / CSS
static函数与普通函数有什么区别
2015/12/25 面试题
最新的咖啡店创业计划书
2013/12/30 职场文书
《藏戏》教学反思
2014/02/11 职场文书
拆迁委托协议书
2014/09/15 职场文书
2014年十一国庆节爱国演讲稿
2014/09/23 职场文书
学习党的群众路线教育实践活动心得体会范文
2014/11/03 职场文书
遗失说明具结保证书
2015/02/26 职场文书
中考百日冲刺决心书
2015/09/22 职场文书