PHP中static关键字原理的学习研究分析


Posted in PHP onJuly 18, 2011

看PHP手册的时候发现了下面这样一段代码:

<?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
  1. Notice: Undefined variable: a 
  2. 10 
  3. 10 
  4. Notice: Undefined variable: a 
  5. 10 
  6. 10 
  7. 100 
  8. 100 
  9. 100 
  10. 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 相关文章推荐
php xml文件操作代码(一)
Mar 20 PHP
php中将数组转成字符串并保存到数据库中的函数代码
Sep 29 PHP
php获取文件类型和文件信息的方法
Jul 10 PHP
php实现微信公众平台账号自定义菜单类
Oct 11 PHP
Laravel中Trait的用法实例详解
Mar 16 PHP
Ubuntu server 11.04安装memcache及php使用memcache来存储session的方法
May 31 PHP
中高级PHP程序员应该掌握哪些技术?
Sep 23 PHP
php 类中的常量、静态属性、非静态属性的区别
Apr 09 PHP
php判断文件上传图片格式的实例详解
Sep 30 PHP
PHP curl批处理及多请求并发实现方法分析
Aug 15 PHP
Laravel第三方包报class not found的解决方法
Oct 13 PHP
TP5框架实现签到功能的方法分析
Apr 05 PHP
在WAMP环境下搭建ZendDebugger php调试工具的方法
Jul 18 #PHP
无法载入 mcrypt 扩展,请检查 PHP 配置终极解决方案
Jul 18 #PHP
PHP通过iconv将字符串从GBK转换为UTF8字符集
Jul 18 #PHP
PHP中英混合字符串截取函数代码
Jul 17 #PHP
PHP操作数组的一些函数整理介绍
Jul 17 #PHP
如何突破PHP程序员的技术瓶颈分析
Jul 17 #PHP
过滤掉PHP数组中的重复值的实现代码
Jul 17 #PHP
You might like
说说PHP的autoLoad自动加载机制
2012/09/27 PHP
PHP Smarty模版简单使用方法
2016/03/30 PHP
Laravel中Facade的加载过程与原理详解
2017/09/22 PHP
php代码调试利器firephp安装与使用方法分析
2018/08/21 PHP
JQuery入门——用bind方法绑定事件处理函数应用介绍
2013/02/05 Javascript
浅析JavaScript中的CSS属性及命名规范
2013/11/28 Javascript
JS表的模拟方法
2015/02/05 Javascript
DOM 高级编程
2015/05/06 Javascript
js+html5绘制图片到canvas的方法
2015/06/05 Javascript
js实现select跳转菜单新窗口效果代码分享(超简单)
2015/08/21 Javascript
jQuery实现简单的文件上传进度条效果
2020/03/26 Javascript
jQuery+PHP实现微信转盘抽奖功能的方法
2016/05/25 Javascript
微信小程序 SocketIO 实例讲解
2016/10/13 Javascript
详解vue-router 路由元信息
2017/09/13 Javascript
Vue中v-show添加表达式的问题(判断是否显示)
2018/03/26 Javascript
promise和co搭配生成器函数方式解决js代码异步流程的比较
2018/05/25 Javascript
vue组件实现进度条效果
2018/06/06 Javascript
微信小程序实现联动选择器
2019/02/15 Javascript
Vue CL3 配置路径别名详解
2019/05/30 Javascript
JS如何实现动态添加的元素绑定事件
2019/11/12 Javascript
vue插件--仿微信小程序showModel实现模态提示窗功能
2020/08/19 Javascript
Python中使用copy模块实现列表(list)拷贝
2015/04/14 Python
python 循环while和for in简单实例
2016/08/16 Python
Python使用Turtle库绘制一棵西兰花
2019/11/23 Python
Python模拟FTP文件服务器的操作方法
2020/02/18 Python
Python OpenCV去除字母后面的杂线操作
2020/07/05 Python
Django跨域请求原理及实现代码
2020/11/14 Python
python不同版本的_new_不同点总结
2020/12/09 Python
详解Html5 Canvas画线有毛边解决方法
2018/03/01 HTML / CSS
毕业生多媒体设计求职信
2013/10/12 职场文书
动漫专业高职生职业生涯规划书
2014/02/15 职场文书
《要下雨了》教学反思
2014/02/17 职场文书
民主生活会对照检查材料(统计局)
2014/09/21 职场文书
县政府领导班子四风问题对照检查材料思想汇报
2014/09/26 职场文书
绍兴鲁迅故居导游词
2015/02/09 职场文书
2015年财务部工作总结
2015/04/10 职场文书