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

2025-05-27 0 73

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

?

1

2

3

4

5

6

7

8

9
<?php

function msg() {

static $a = 0;

echo $a++, '<br />';

}

msg();

msg();

msg();

上述代码,分别输出0,1,2 静态变量$a在第一次定义并初始化后就会常驻内存,直到脚本执行完毕。

当第二次调用msg()函数时,这时的$a值为1,而不会变成0。

那么问题来了,请看下面的一段代码:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62
$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函数如下,从函数参数引入一个外部变量的引用,来解决此问题。

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22
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程序设计有所帮助。

原文链接:https://www.cnblogs.com/jkko123/p/6294607.html

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 php 函数中静态变量使用的问题实例分析 https://www.kuaiidc.com/70614.html

相关文章

发表评论
暂无评论