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独立Session数据库存储操作类分享
Jun 11 PHP
PHP中new static() 和 new self() 的区别介绍
Jan 09 PHP
php+xml实现在线英文词典查询的方法
Jan 23 PHP
PHP的关于变量和日期处理的一些面试题目整理
Aug 10 PHP
PHP 下载文件时如何自动添加bom头及解释BOM头和去掉bom头的方法
Jan 04 PHP
PHP基于cookie与session统计网站访问量并输出显示的方法
Jan 15 PHP
PHP输出图像imagegif、imagejpeg与imagepng函数用法分析
Nov 14 PHP
ajax+php实现无刷新验证手机号的实例
Dec 22 PHP
Yii2压缩PHP中模板代码的输出问题
Aug 28 PHP
TP5框架简单登录功能实现方法示例
Oct 31 PHP
php7 错误处理机制修改实例分析
May 25 PHP
PHP如何通过date() 函数格式化显示时间
Nov 13 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 获取MSN好友列表的代码(2009-05-14测试通过)
2009/09/09 PHP
深入php多态的实现详解
2013/06/09 PHP
简单的php文件上传(实例)
2013/10/27 PHP
PHP Yii框架之表单验证规则大全
2015/11/16 PHP
PHP结合Jquery和ajax实现瀑布流特效
2016/01/07 PHP
超级退弹代码
2008/07/07 Javascript
javascript setAttribute, getAttribute 在不同浏览器上的不同表现
2010/08/05 Javascript
JQuery DataTable删除行后的页面更新利用Ajax解决
2013/05/17 Javascript
ExtJS4如何给同一个formpanel不同的url
2014/05/02 Javascript
轻松学习jQuery插件EasyUI EasyUI实现拖动基本操作
2015/11/30 Javascript
jQuery实现摸拟alert提示框
2016/05/22 Javascript
bootstrap网格系统使用方法解析
2017/01/13 Javascript
js return返回多个值,通过对象的属性访问方法
2017/02/21 Javascript
为JQuery EasyUI 表单组件增加焦点切换功能的方法
2017/04/13 jQuery
十分钟带你快速了解React16新特性
2017/11/10 Javascript
判断div滑动到底部的scroll实例代码
2017/11/15 Javascript
关于ES6箭头函数中的this问题
2018/02/27 Javascript
JavaScript中var、let、const区别浅析
2018/06/24 Javascript
vue.config.js常用配置详解
2019/11/14 Javascript
[02:19]2018年度DOTA2最佳核心位选手-完美盛典
2018/12/17 DOTA
使用Python脚本和ADB命令实现卸载App
2017/02/10 Python
wxPython实现列表增删改查功能
2019/11/19 Python
将matplotlib绘图嵌入pyqt的方法示例
2020/01/08 Python
Django分组聚合查询实例分享
2020/04/29 Python
全球最大最受欢迎的旅游社区:Tripadvisor
2017/11/03 全球购物
饿了么订餐官网:外卖、网上订餐
2019/06/28 全球购物
JSP&Servlet技术面试题
2015/05/21 面试题
幼儿园美术教学反思
2014/01/31 职场文书
竞选班长的演讲稿
2014/04/24 职场文书
教师先进事迹材料
2014/12/16 职场文书
捐款仪式主持词
2015/07/04 职场文书
2016年毕业实习心得体会范文
2015/10/09 职场文书
合同范本之电脑出租
2019/08/13 职场文书
nginx配置proxy_pass中url末尾带/与不带/的区别详解
2021/03/31 Servers
Redis 配置文件重要属性的具体使用
2021/05/20 Redis
小程序实现悬浮按钮的全过程记录
2021/10/16 HTML / CSS