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 相关文章推荐
基于mysql的论坛(5)
Oct 09 PHP
PHP 配置open_basedir 让各虚拟站点独立运行
Nov 12 PHP
php设计模式 Mediator (中介者模式)
Jun 26 PHP
PHP在特殊字符前加斜杠的实现代码
Jul 17 PHP
PHP对接微信公众平台消息接口开发流程教程
Mar 25 PHP
ThinkPHP关于session的操作方法汇总
Jul 18 PHP
php实现图片添加描边字和马赛克的方法
Dec 10 PHP
Yii中实现处理前后台登录的新方法
Dec 28 PHP
Linux下编译redis和phpredis的方法
Apr 07 PHP
php微信公众账号开发之前五个坑(一)
Sep 18 PHP
基于Codeigniter框架实现的student信息系统站点动态发布功能详解
Mar 23 PHP
Laravel + Elasticsearch 实现中文搜索的方法
Feb 02 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购物车实现代码
2011/10/10 PHP
php实现的mongodb操作类
2015/05/28 PHP
php打开本地exe程序,js打开本地exe应用程序,并传递相关参数方法
2018/02/06 PHP
PHP面向对象类型约束用法分析
2019/06/12 PHP
Javascript 生成指定范围数值随机数
2009/01/09 Javascript
javascript 设置文本框中焦点的位置
2009/11/20 Javascript
测试JavaScript字符串处理性能的代码
2009/12/07 Javascript
jQuery EasyUI API 中文文档 - ComboBox组合框
2011/10/07 Javascript
使用js解决由border属性引起的div宽度问题
2013/11/26 Javascript
jQuery-1.9.1源码分析系列(十)事件系统之事件包装
2015/11/20 Javascript
cocos creator Touch事件应用(触控选择多个子节点的实例)
2017/09/10 Javascript
JS简单实现点击跳转登陆邮箱功能的方法
2017/10/31 Javascript
Vue.js实现备忘录功能
2019/06/26 Javascript
开源一个微信小程序仪表盘组件过程解析
2019/07/30 Javascript
一起写一个即插即用的Vue Loading插件实现
2019/10/31 Javascript
详解关于Vue单元测试的几个坑
2020/04/26 Javascript
vue 组件之间事件触发($emit)与event Bus($on)的用法说明
2020/07/28 Javascript
微信小程序实现简单的select下拉框
2020/11/23 Javascript
python应用程序在windows下不出现cmd窗口的办法
2014/05/29 Python
在Python中处理XML的教程
2015/04/29 Python
python实现逻辑回归的方法示例
2017/05/02 Python
Python for循环生成列表的实例
2018/06/15 Python
Flask配置Cors跨域的实现
2019/07/12 Python
python中time包实例详解
2021/02/02 Python
css3隔行变换色实现示例
2014/02/19 HTML / CSS
英国安全产品购物网站:The Safe Shop
2017/03/20 全球购物
大学生应聘推荐信范文
2013/11/19 职场文书
师范教师大学生职业生涯规划范文
2014/01/05 职场文书
转预备党员政审材料
2014/02/06 职场文书
护士自我鉴定总结
2014/03/24 职场文书
水污染治理工程专业求职信
2014/06/14 职场文书
2014教师“四风问题”对照检查材料思想汇报
2014/09/16 职场文书
师德师风学习材料
2014/12/19 职场文书
元宵节寄语大全
2015/02/27 职场文书
企业廉洁教育心得体会
2016/01/20 职场文书
Maven学习----Maven安装与环境变量配置教程
2021/06/29 Java/Android