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里的JS打印函数
Oct 09 PHP
php self,$this,const,static,-&amp;gt;的使用
Oct 22 PHP
CodeIgniter图像处理类的深入解析
Jun 17 PHP
PHP实现通过中文字符比率来判断垃圾评论的方法
Oct 20 PHP
php进行支付宝开发中return_url和notify_url的区别分析
Dec 22 PHP
php实现每天自动变换随机问候语的方法
May 12 PHP
详解php的socket通信
Aug 11 PHP
PHP封装返回Ajax字符串和JSON数组的方法
Feb 17 PHP
PHP实现的简单适配器模式示例
Jun 22 PHP
php实现socket推送技术的示例
Dec 20 PHP
PHP下用Swoole实现Actor并发模型的方法
Jun 12 PHP
详解PHP中的8个魔术常量
Jul 06 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+ajax 实现输入读取数据库显示匹配信息
2015/10/08 PHP
yii2带搜索功能的下拉框实例详解
2016/05/12 PHP
微信 getAccessToken方法详解及实例
2016/11/23 PHP
取得传值的函数
2006/10/27 Javascript
Javascript的闭包
2009/12/31 Javascript
jquery 插件开发备注
2010/08/27 Javascript
jQuery UI AutoComplete 使用说明
2011/06/20 Javascript
《JavaScript高级编程》学习笔记之object和array引用类型
2015/11/01 Javascript
JS实现的倒计时效果实例(2则实例)
2015/12/23 Javascript
Bootstrap打造一个左侧折叠菜单的系统模板(一)
2016/05/17 Javascript
JS获取子窗口中返回的数据实现方法
2016/05/28 Javascript
JS防止网页被嵌入iframe框架的方法分析
2016/09/13 Javascript
jQuery is not defined 错误原因与解决方法小结
2017/03/19 Javascript
Node.js+Express+MySql实现用户登录注册功能
2017/07/10 Javascript
使用3D引擎threeJS实现星空粒子移动效果
2020/09/13 Javascript
javaScript动态添加Li元素的实例
2018/02/24 Javascript
详解ES6系列之私有变量的实现
2018/11/21 Javascript
利用d3.js制作连线动画图与编辑器的方法实例
2019/09/05 Javascript
JS Thunk 函数的含义和用法实例总结
2020/04/08 Javascript
解决vue项目axios每次请求session不一致的问题
2020/10/24 Javascript
vue iview 隐藏Table组件里的某一列操作
2020/11/13 Javascript
Django自定义分页与bootstrap分页结合
2021/02/22 Python
Python操作SQLite数据库的方法详解【导入,创建,游标,增删改查等】
2017/07/11 Python
Python实现平行坐标图的绘制(plotly)方式
2019/11/22 Python
python pandas移动窗口函数rolling的用法
2020/02/29 Python
Python单例模式的四种创建方式实例解析
2020/03/04 Python
美国在线眼镜店:GlassesShop
2018/11/15 全球购物
《宋庆龄故居的樟树》教学反思
2014/04/07 职场文书
学校献爱心活动总结
2014/07/08 职场文书
教师批评与自我批评心得体会
2014/10/16 职场文书
违反交通安全法检讨书
2014/10/24 职场文书
道路交通事故赔偿协议书
2014/10/24 职场文书
《社戏》教学反思
2016/02/22 职场文书
Pandas||过滤缺失数据||pd.dropna()函数的用法说明
2021/05/14 Python
OpenCV实现反阈值二值化
2021/11/17 Java/Android
Java中的继承、多态以及封装
2022/04/11 Java/Android