PHP中static关键字原理的学习研究分析
2011-07-18 00:00
531 查看
看PHP手册的时候发现了下面这样一段代码:
执行结果如下:
这是一个递归的函数,声明的静态变量count记录次数,输出1~10。
我在看的时候有个疑惑,递归调用的时候 static $count = 0; 语句会重复执行,这为什么不会导致count变量被重复赋值呢?带着这个疑问和同事研究了一下,测试用代码如下:
执行结果如下:
start
4
Notice: Undefined variable: a
4
10
10
Notice: Undefined variable: a
10
10
100
100
100
end
(结果中关于文件位置的部分已删去。也可以去掉echo语句使用zend的debug功能查看,这样结果更清晰)
代码第5行第一次输出$a的值为4,由此推测PHP在页面初始化的时候分配静态变量的内存,此时使用了同一个变量的最后一次声明的值(这个可以把4改为其他数测试)。代码第7行调用unset函数销毁变量$a,再次输出$a的值时看到未定义变量的提示,说明变量已经被销毁。
第10行再次输出时,输出结果仍是4而不是20,有两种可能,一个是php再次初始化了$a的值,另一种是php使用了$a被销毁前的值,这个问题在第20行输出的时候解决。第16行$a销毁的时候值为10,第19行声明后输出仍为10。
第11行将$a的值修改为10,在14行再次声明$a,17行输出认为10。推测为重复声明时php还是使用静态变量内存中的值,而不再次赋值。
至此,手册中发现的问题,大致上已经解决了,即递归调用中的声明没有改变$count的值,所以递归在$count=10时成功停止。
可能有理解不正确的地方,欢迎拍砖。
<?php function Test() { static $count = 0; $count++; echo $count; if ($count < 10) { Test(); } $count--; } ?>
执行结果如下:
这是一个递归的函数,声明的静态变量count记录次数,输出1~10。
我在看的时候有个疑惑,递归调用的时候 static $count = 0; 语句会重复执行,这为什么不会导致count变量被重复赋值呢?带着这个疑问和同事研究了一下,测试用代码如下:
<?php echo 'start<br />'; static $a = 10; echo "$a <br />"; unset($GLOBALS['a']); echo "$a <br />"; static $a = 20; echo "$a <br />"; $GLOBALS['a'] = 10; echo "$a <br />"; static $a = 30; echo "$a <br />"; unset($GLOBALS['a']); echo "$a <br />"; static $a; echo "$a <br />"; static $a = 40; echo "$a <br />"; $a = 100; echo "$a <br />"; static $a = 50; echo "$a <br />"; static $a = 4; echo "$a <br />"; echo 'end <br />'; exit; ?>
执行结果如下:
start
4
Notice: Undefined variable: a
4
10
10
Notice: Undefined variable: a
10
10
100
100
100
end
(结果中关于文件位置的部分已删去。也可以去掉echo语句使用zend的debug功能查看,这样结果更清晰)
代码第5行第一次输出$a的值为4,由此推测PHP在页面初始化的时候分配静态变量的内存,此时使用了同一个变量的最后一次声明的值(这个可以把4改为其他数测试)。代码第7行调用unset函数销毁变量$a,再次输出$a的值时看到未定义变量的提示,说明变量已经被销毁。
第10行再次输出时,输出结果仍是4而不是20,有两种可能,一个是php再次初始化了$a的值,另一种是php使用了$a被销毁前的值,这个问题在第20行输出的时候解决。第16行$a销毁的时候值为10,第19行声明后输出仍为10。
第11行将$a的值修改为10,在14行再次声明$a,17行输出认为10。推测为重复声明时php还是使用静态变量内存中的值,而不再次赋值。
至此,手册中发现的问题,大致上已经解决了,即递归调用中的声明没有改变$count的值,所以递归在$count=10时成功停止。
可能有理解不正确的地方,欢迎拍砖。
相关文章推荐
- PHP中static关键字原理的学习研究分析
- 【PHP内核学习】global关键字的解析过程分析
- php入门学习-----const&static&final关键字
- C语言学习笔记(二) static关键字详细分析
- 【学习点滴-php】static关键字---延迟静态绑定
- php中static和const关键字用法分析
- Objective-C研究之static关键字学习(六)
- php中static和const关键字用法分析
- 学习笔记1:《大型网站技术架构 核心原理与案例分析》之 大型网站软件系统的特点
- css浮动原理学习与分析
- javaSE学习笔记之几个关键字this、super、final、static
- 深入理解PHP原理之执行周期分析
- 【BZOJ4241】【回滚莫队】历史研究 (非题解的学习分析)
- static关键字以及内存分析
- PHP内核研究: PHP源码目录分析
- Hibernate学习02---Hibernate原理分析和模拟其实现
- PHP依赖注入原理与用法分析
- php中static静态关键字的使用方法和应用场景
- 分步学习Struts(三) 原理分析
- php程序提速原理分析