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实现登陆验证码(类似条行码状)
Oct 09 PHP
php 过滤危险html代码
Jun 29 PHP
PHP 进程锁定问题分析研究
Nov 24 PHP
PHP中运用jQuery的Ajax跨域调用实现代码
Feb 21 PHP
浅谈apache和nginx的rewrite的区别
Feb 22 PHP
php实现查询百度google收录情况(示例代码)
Aug 02 PHP
[原创]PHP简单开启curl的方法(测试可行)
Jan 11 PHP
浅析php静态方法与非静态方法的用法区别
May 17 PHP
基于Swoole实现PHP与websocket聊天室
Aug 03 PHP
php中青蛙跳台阶的问题解决方法
Oct 14 PHP
php命名空间设计思想、用法与缺点分析
Jul 17 PHP
php创建类并调用的实例方法
Sep 25 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中使用Oracle数据库(5)
2006/10/09 PHP
win2003服务器使用WPS的COM组件的一些问题解决方法
2012/01/11 PHP
php中simplexml_load_string使用实例分享
2014/02/13 PHP
php中cookie的使用方法
2014/03/29 PHP
php将字符串全部转换成大写或者小写的方法
2015/03/17 PHP
jQuery TextBox自动完成条
2009/07/22 Javascript
解析Javascript小括号“()”的多义性
2013/12/03 Javascript
js光标定位文本框回车表单提交问题的解决方法
2015/05/11 Javascript
jQuery+HTML5美女瀑布流布局实现方法
2015/09/21 Javascript
jquery关于事件冒泡和事件委托的技巧及阻止与允许事件冒泡的三种实现方法
2015/11/27 Javascript
Jquery+ajax+JAVA(servlet)实现下拉菜单异步取值
2016/03/23 Javascript
Node做中转服务器转发接口
2017/10/18 Javascript
webpack-dev-server自动更新页面方法
2018/02/22 Javascript
vue eslint简要配置教程详解
2019/07/26 Javascript
Node.JS发送http请求批量检查文件中的网页地址、服务是否有效可用
2019/11/20 Javascript
微信小程序仿淘宝热搜词在搜索框中轮播功能
2020/01/21 Javascript
python实现将文本转换成语音的方法
2015/05/28 Python
Python实现Sqlite将字段当做索引进行查询的方法
2016/07/21 Python
新手如何快速入门Python(菜鸟必看篇)
2017/06/10 Python
python实现微信自动回复功能
2018/04/11 Python
Python PyQt4实现QQ抽屉效果
2018/04/20 Python
kaggle+mnist实现手写字体识别
2018/07/26 Python
Python从ZabbixAPI获取信息及实现Zabbix-API 监控的方法
2018/09/17 Python
python获取微信企业号打卡数据并生成windows计划任务
2019/04/30 Python
面向对象学习之pygame坦克大战
2019/09/11 Python
python getpass实现密文实例详解
2019/09/24 Python
Python中Subprocess的不同函数解析
2019/12/10 Python
Python中全局变量和局部变量的理解与区别
2021/02/07 Python
Python中Qslider控件实操详解
2021/02/20 Python
美国时尚孕妇装品牌:A Pea in the Pod
2017/07/16 全球购物
Maisons du Monde德国:法国家具和装饰的市场领导者
2019/07/26 全球购物
财务主管的岗位职责
2013/12/30 职场文书
护士演讲稿范文
2014/01/05 职场文书
男人帮观后感
2015/06/18 职场文书
工作计划范文之财务管理
2019/08/09 职场文书
使用CSS自定义属性实现骨架屏效果
2022/06/21 HTML / CSS