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中比较简单的导入phpmyadmin生成的sql文件的方法
Jun 28 PHP
探讨PHP JSON中文乱码的解决方法详解
Jun 06 PHP
PHP读取RSS(Feed)简单实例
Jun 12 PHP
从零开始学YII2框架(一)通过Composer安装Yii2框架
Aug 20 PHP
php使用function_exists判断函数可用的方法
Nov 19 PHP
PHP中使用php5-ffmpeg撷取视频图片实例
Jan 07 PHP
php对数组内元素进行随机调换的方法
May 12 PHP
php判断访问IP的方法
Jun 19 PHP
thinkphp在php7环境下提示Cannot use ‘String’ as class name as it is reserved的解决方法
Sep 30 PHP
PHP在弹框中获取foreach中遍历的id值并传递给地址栏
Jun 13 PHP
Yii2.0框架behaviors方法使用实例分析
Sep 30 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 syntax error, unexpected $end 错误的一种原因及解决
2008/10/25 PHP
php之XML转数组函数的详解
2013/06/07 PHP
php对csv文件的读取,写入,输出下载操作详解
2013/08/10 PHP
php中get_defined_constants函数用法实例分析
2015/05/12 PHP
PHP实现适用于文件内容操作的分页类
2016/06/15 PHP
PHP基于自定义函数生成笛卡尔积的方法示例
2017/09/30 PHP
DOM相关内容速查手册
2007/02/07 Javascript
几行代码轻松搞定jquery实现flash8类似的连接效果
2007/05/03 Javascript
写出更好的JavaScript之undefined篇(上)
2009/11/22 Javascript
Jquery Ajax的Get方式时需要注意URL地方
2011/04/07 Javascript
js 判断所选时间(或者当前时间)是否在某一时间段的实现代码
2015/09/05 Javascript
jquery实现隐藏在左侧的弹性弹出菜单效果
2015/09/18 Javascript
常用js,css文件统一加载方法(推荐) 并在加载之后调用回调函数
2016/09/23 Javascript
Javascript中 带名 匿名 箭头函数的重要区别(推荐)
2017/01/29 Javascript
Vue单页式应用(Hash模式下)实现微信分享的实例
2017/07/21 Javascript
node实现基于token的身份验证
2018/04/09 Javascript
D3.js实现拓扑图的示例代码
2018/06/30 Javascript
Spring boot 和Vue开发中CORS跨域问题解决
2018/09/05 Javascript
深入了解响应式React Native Echarts组件
2019/05/29 Javascript
[01:06]DOTA2隆重推出2016冬季勇士令状 内含上海特级锦标赛互动指南
2016/02/17 DOTA
Python Tkinter基础控件用法
2014/09/03 Python
Python使用Pycrypto库进行RSA加密的方法详解
2016/06/06 Python
使用Python和xlwt向Excel文件中写入中文的实例
2018/04/21 Python
Python干货:分享Python绘制六种可视化图表
2018/08/27 Python
Python打包方法Pyinstaller的使用
2018/10/09 Python
Django框架静态文件使用/中间件/禁用ip功能实例详解
2019/07/22 Python
tensorflow的ckpt及pb模型持久化方式及转化详解
2020/02/12 Python
PyQt5-QDateEdit的简单使用操作
2020/07/12 Python
Python实现上下文管理器的方法
2020/08/07 Python
基于CSS3实现的几个小loading效果
2018/09/27 HTML / CSS
巴西电子产品购物网站:Saldão da Informática
2018/01/09 全球购物
音乐教育感言
2014/03/05 职场文书
小学运动会报道稿
2014/10/04 职场文书
第一军规观后感
2015/06/12 职场文书
简爱读书笔记
2015/06/26 职场文书
基于CSS制作创意端午节专属加载特效
2022/06/01 HTML / CSS