php 函数内的静态变量,php 函数中静态变量使用的问题实例分析

当前位置:首页 > 网络编程 > PHP编程 > 详细页面

php 函数中静态变量使用的问题实例分析

时间:2020-03-05来源:电脑系统城作者:电脑系统城

本文实例讲述了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字符串(string)用法总结》、《PHP数组(Array)操作技巧大全》、《PHP数据结构与算法教程》及《php程序设计算法总结》

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

分享到:

相关信息

7bf270d16f0e4c6235383e3c32ac73bb.png

Laravel框架自定义分页样式操作示例

这篇文章主要介绍了Laravel框架自定义分页样式操作,结合实例形式详细分析了laravel框架自定义分页样式的具体操作步骤、实现方法及相关注意事项,需要的朋友可以参考下...

2020-02-03

4c9118ae79829ab455c383fb745742e7.png

php封装的page分页类完整实例代码

这篇文章主要介绍了php封装的page分页类完整实例代码,需要的朋友可以参考下...

2020-02-03

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值