本文实例讲述了php 函数中静态变量使用的问题。分享给大家供大家参考,具体如下:

function msg() {

static $a = 0;

echo $a++, '
';

}

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 .= '' . str_repeat(' ', $level * 3) . $v['title'] . '';

if (!empty($v[$son])) {

getOpts($v[$son], $idArr, $level + 1, $son);

}

}

}

return $opt;

}

$data = genTree($data);

echo '';

//第一次调用getOpts时,没有任何问题。

echo getOpts($data);

echo '';

$data2 = genTree($data2);

echo '';

//当第二次调用时,问题就出现了,还留有上次的数据

echo getOpts($data2);

echo '';

上述问题,对于可能多次调用的函数,不建议在内部使用静态变量。

修改getOpts函数如下,从函数参数引入一个外部变量的引用,来解决此问题。

function getOpts($data, $idArr = array(), &$opt = '', $level = 0, $son = 'child') {

if (!empty($data)) {

foreach ($data as $k => $v) {

$opt .= '' . str_repeat(' ', $level * 3) . $v['title'] . '';

if (!empty($v[$son])) {

getOpts($v[$son], $idArr, $opt, $level + 1, $son);

}

}

}

}

$data = genTree($data);

getOpts($data, array(), $opt);

echo '';

echo $opt;

echo '';

$data2 = genTree($data2);

getOpts($data2, array(), $opt2);

echo '';

echo $opt2;

echo '';

希望本文所述对大家PHP程序设计有所帮助。

php 函数静态变量,php 函数中静态变量使用的问题实例分析相关推荐

  1. 在php中函数名称区分大小写吗,PHP中的变量名,函数名,类名是区分大小写的吗...

    在javascript中关于变量与函数的提升 在javascript中关于变量与函数的提升 一.简介 在javascript中声明变量与函数的执行步骤: 1.先预解析变量或函数声明代码,会把用var声 ...

  2. java商城项目中多线程执行_java多线程中执行多个程序的实例分析

    我们知道多线程因为同时处理子线程的能力,对于程序运行来说,能够达到很高的效率.不过很多人对于多线程的执行方法还没有尝试过,本篇我们将为大家介绍创建线程的方法,在这个基础上,对程序执行多条命令的方法进行 ...

  3. python asyncio教程_python中使用asyncio实现异步IO实例分析

    1.说明 Python实现异步IO非常简单,asyncio是Python 3.4版本引入的标准库,直接内置了对异步IO的支持. asyncio的编程模型就是一个消息循环.我们从asyncio模块中直接 ...

  4. python怎么处理数据_python中scrapy处理项目数据的实例分析

    在我们处理完数据后,习惯把它放在原有的位置,但是这样也会出现一定的隐患.如果因为新数据的加入或者其他种种原因,当我们再次想要启用这个文件的时候,小伙伴们就会开始着急却怎么也翻不出来,似乎也没有其他更好 ...

  5. C++57个入门知识点_17 类的访问权限及C语言模拟类的封装(类的私有权限突破方法:编译期进行权限检查,运行期通过指针修改类的私有成员变量;利用函数指针对结构体中成员变量进行修改;CPU大小尾排列)

    接上篇:C++57个入门知识点_16 类的标准写法(类名.成员变量.成员函数及对象命名规则:成员变量一般为私有,成员函数为公有并暴露给外部使用成员变量:防止类过大,声明写在.h,实现写在.cpp,调用 ...

  6. fb静态区域_fb块中静态变量

    在回答你的问题之前,有必要对变量声明表有一个基本了解.在STEP7中有两种用来定义符号地址的表格形式:符号表(共享符号)和变量声明表(局域符号),其本质都是为了建立绝对地址与符号地址之间的内在联系,但 ...

  7. 计算机中的变量和函数是什么意思,计算机中的变量和函数是什么意思?

    2019-03-13 回答 if 全部显示 全部隐藏 根据对指定的条件计算结果为true或false,返回不同的结果. 可以使用if对数值和公式执行条件检测. 语法 if(logical_test,v ...

  8. java中静态是什么,java中静态和非静态有什么区别

    首先我们先来说说jvm内存模型: jvm内存分为:方法区.堆.栈和程序计数器. 下面我们来简单的说说方法区.栈和堆: 方法区:是各个线程共享的区域,存放类信息/常量/静态变量: 栈:其实每个线程都会分 ...

  9. c语言中常见的变量,C语言中的变量详解

    先说说变量的作用域,比如,在函数中,形参变量只是在被调用期间才分配内存单元,调用结束立即释放.这就说明形参变量只有在函授内才是有效的,离开该函数就不能再使用了. 这种变量有效性的范围称为变量的作用域. ...

  10. pwd赋值给变量 shell_Shell脚本中的变量详解

    一.Shell变量 变量:是shell传递数据的一种方式,用来代表每个取值的符号名. 当shell脚本需要保存一些信息时,如一个文件名或是一个数字,就把它存放在一个变量中. 二.变量设置规则: 变量名 ...

最新文章

  1. matlab中prismastic,魅力值是什么意思
  2. Linux下编译cscope,linux环境下cscope使用
  3. python的工作方向-Python最有发展潜力的方向已出来,是否有你喜欢的职位?
  4. Hadoop生成HFile直接入库HBase心得
  5. QML与C++交互:登陆界面设计
  6. ModuleNotFoundError: No module named ‘openpyxl‘
  7. 如何选择MBA教育 读MBA前必答10个问题
  8. java分页模板_java 分页模型的模板
  9. UE4加载osgb倾斜摄影数据
  10. linux ddd yum,Linux环境ddd安装与使用
  11. [改善Java代码]边界,边界,还是边界
  12. Get Server Down when retrieve the channel list in sopcast, how to solve it?
  13. mac 运行android模拟器速度慢,Mac下顺畅的安卓模拟器:网易MuMu
  14. Excel作统计图表
  15. 海底捞“清疮”300店:千亿龙头的虚与实
  16. 我的世界服务器存档的文件夹,我的世界存档在哪个文件夹
  17. Craft CMS简介
  18. osg导入模型时,模型全黑的原因及解决方法分析
  19. 什么是集群和集群的分类
  20. Android VR入门文章

热门文章

  1. Hadoop streaming: Exception in thread main java.io.IOException: No space left on device
  2. python logging 毫秒级别的时间打印
  3. Spark:一个高效的分布式计算系统--转
  4. 火狐浏览器修改userAgent
  5. 支付系统路由系统设计
  6. 区块链研习 | 区块链里所说的“智能合约”是什么? 本文作者:敖萌 编辑:温晓桦 2017-10-11 20:31 导语:谈到区块链,必然离不开“智能合约”这个词。我们在本系列的第一篇文章中提到“智能
  7. 风控评分模型全流程的开发及应用
  8. MySQL - 使用trace工具来窥探MySQL是如何选择执行计划的
  9. 小学听课计算机笔记范文,小学教师听课记录精选10篇【最新】.pdf
  10. android 从底部网上的平移动画_Android属性动画,看完这篇够用了吧