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 相关文章推荐
如何跨站抓取别的站点的页面的补充
Oct 09 PHP
php中批量替换文件名的实现代码
Jul 20 PHP
php利用iframe实现无刷新文件上传功能的代码
Sep 29 PHP
php权重计算方法代码分享
Jan 09 PHP
php去除字符串换行符示例分享
Feb 13 PHP
浅谈COOKIE和SESSION区别
Jul 19 PHP
yii2实现根据时间搜索的方法
May 25 PHP
CodeIgniter框架常见用法工作总结
Mar 16 PHP
php生成无限栏目树
Mar 16 PHP
PHP实现驼峰样式字符串(首字母大写)转换成下划线样式字符串的方法示例
Aug 10 PHP
PHP利用递归函数实现无限级分类的方法
Mar 22 PHP
phpquery中文手册
Mar 18 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中的extract的作用分析
2008/04/09 PHP
浅析php中jsonp的跨域实例
2013/06/21 PHP
浅析php中常量,变量的作用域和生存周期
2013/08/10 PHP
php面向对象中的魔术方法中文说明
2014/03/04 PHP
php表单提交与$_POST实例分析
2015/01/26 PHP
PHP记录页面停留时间的方法
2016/03/30 PHP
菜单效果
2006/10/14 Javascript
JQuery 实现的页面滚动时浮动窗口控件
2009/07/10 Javascript
基于jQuery实现图片的前进与后退功能
2013/04/24 Javascript
JS实现网页表格自动变大缩小的方法
2015/03/09 Javascript
javascript去掉代码里面的注释
2015/07/24 Javascript
JavaScript编写带旋转+线条干扰的验证码脚本实例
2016/05/30 Javascript
js获取当前时间(昨天、今天、明天)
2016/11/23 Javascript
Angular中支持SCSS的方法
2017/11/18 Javascript
JavaScript伪数组用法实例分析
2017/12/22 Javascript
关于vue中 $emit的用法详解
2018/04/12 Javascript
vue通过v-html指令渲染的富文本无法修改样式的解决方案
2020/05/20 Javascript
NodeJS配置CORS实现过程详解
2020/12/02 NodeJs
使用python判断jpeg图片的完整性实例
2019/06/10 Python
Django框架HttpResponse对象用法实例分析
2019/11/01 Python
python基于三阶贝塞尔曲线的数据平滑算法
2019/12/27 Python
Python小整数对象池和字符串intern实例解析
2020/03/21 Python
python绘图pyecharts+pandas的使用详解
2020/12/13 Python
css3绘制百度的小度熊
2018/10/29 HTML / CSS
HTML5拖拽文件到浏览器并实现文件上传下载功能代码
2013/06/06 HTML / CSS
英国天然有机美容护肤品:Neal’s Yard Remedies
2018/05/05 全球购物
几个人围成一圈的问题
2013/09/26 面试题
公司司机岗位职责范本
2014/03/03 职场文书
服务行业口号
2014/06/11 职场文书
集团财务总监岗位职责
2015/04/03 职场文书
2015中学教学工作总结
2015/07/22 职场文书
教师远程培训心得体会
2016/01/09 职场文书
闭幕词的写作格式与范文!
2019/06/24 职场文书
如何使用分区处理MySQL的亿级数据优化
2021/06/18 MySQL
python的变量和简单数字类型详解
2021/09/15 Python
如何更改Win11声音输出设备?Win11声音输出设备四种更改方法
2022/04/08 数码科技