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 相关文章推荐
PHP4在WinXP下IIS和Apache2服务器上的安装实例
Oct 09 PHP
PHP 实现多服务器共享 SESSION 数据
Aug 15 PHP
php中常用字符串处理代码片段整理
Nov 07 PHP
如何用PHP实现插入排序?
Apr 10 PHP
去除php注释和去除空格函数分享
Mar 13 PHP
PHP中一些可以替代正则表达式函数的字符串操作函数
Nov 17 PHP
php生成高清缩略图实例详解
Dec 07 PHP
php使用正则验证中文
Apr 06 PHP
PHP中类的继承和用法实例分析
May 24 PHP
php解决约瑟夫环算法实例分析
Sep 30 PHP
php文件上传原理与实现方法详解
Dec 20 PHP
PHP使用Redis队列执行定时任务实例讲解
Mar 24 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制作静态网站的模板框架
2006/10/09 PHP
用PHP将数据导入到Foxmail
2006/10/09 PHP
php5 mysql分页实例代码
2008/04/10 PHP
php强制下载类型的实现代码
2011/04/21 PHP
分享PHP计算两个日期相差天数的代码
2015/12/23 PHP
php命令行写shell实例详解
2018/07/19 PHP
12行javascript代码绘制一个八卦图
2015/04/02 Javascript
jquery无限级联下拉菜单简单实例演示
2015/11/23 Javascript
jQuery实现下拉框左右移动(全部移动,已选移动)
2016/04/15 Javascript
AngularJS入门教程之Scope(作用域)
2016/07/27 Javascript
canvas时钟效果
2017/02/16 Javascript
手把手教你把nodejs部署到linux上跑出hello world
2017/06/19 NodeJs
jQuery实现的鼠标拖动浮层功能示例【拖动div等任何标签】
2018/12/29 jQuery
微信小程序实现搜索历史功能
2020/03/26 Javascript
js实现九宫格布局效果
2020/05/28 Javascript
Python修改Excel数据的实例代码
2013/11/01 Python
python 远程统计文件代码分享
2015/05/14 Python
利用Python实现Windows下的鼠标键盘模拟的实例代码
2017/07/13 Python
python实现校园网自动登录的示例讲解
2018/04/22 Python
浅谈python中真正关闭socket的方法
2018/12/18 Python
Python3.6+Django2.0以上 xadmin站点的配置和使用教程图解
2019/06/04 Python
基于Tensorflow批量数据的输入实现方式
2020/02/05 Python
python 实现人和电脑猜拳的示例代码
2020/03/02 Python
python库skimage给灰度图像染色的方法示例
2020/04/27 Python
opencv 形态学变换(开运算,闭运算,梯度运算)
2020/07/07 Python
python PIL模块的基本使用
2020/09/29 Python
利用canvas实现图片下载功能来实现浏览器兼容问题
2019/05/31 HTML / CSS
html5-Canvas可以在web中绘制各种图形
2012/12/26 HTML / CSS
餐厅总经理岗位职责
2013/12/31 职场文书
管理学院毕业生自荐信范文
2014/03/10 职场文书
远程网络教育毕业生自我鉴定
2014/04/14 职场文书
带病坚持工作事迹
2014/05/03 职场文书
民事上诉状范文
2015/05/22 职场文书
python某漫画app逆向
2021/03/31 Python
pytorch常用数据类型所占字节数对照表一览
2021/05/17 Python
MySQL对数据表已有表进行分区表的实现
2021/11/01 MySQL