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 相关文章推荐
一个连接两个不同MYSQL数据库的PHP程序
Oct 09 PHP
php 什么是PEAR?(第三篇)
Mar 19 PHP
PHP 实现多服务器共享 SESSION 数据
Aug 15 PHP
PHP图片自动裁切应付不同尺寸的显示
Oct 16 PHP
php数组去除空值函数分享
Feb 02 PHP
使用PHP编写发红包程序
Jul 22 PHP
php基础设计模式大全(注册树模式、工厂模式、单列模式)
Aug 31 PHP
php三种实现多线程类似的方法
Oct 30 PHP
Yii模型操作之criteria查找数据库的方法
Jul 15 PHP
PHP 中使用ajax时一些常见错误总结整理
Feb 27 PHP
php对微信支付回调处理的方法
Aug 23 PHP
PHP常量DIRECTORY_SEPARATOR原理及用法解析
Nov 10 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
一个用于网络的工具函数库
2006/10/09 PHP
PHP中SESSION使用中的一点经验总结
2012/03/30 PHP
PHP中时间加减函数strtotime用法分析
2017/04/26 PHP
php实现在线考试系统【附源码】
2018/09/18 PHP
javascript优先加载笔记代码
2008/09/30 Javascript
JavaScript 学习笔记(十二) dom
2010/01/21 Javascript
Jquery index()方法 获取相应元素索引值
2012/10/12 Javascript
nodejs中exports与module.exports的区别详细介绍
2013/01/14 NodeJs
js触发asp.net的Button的Onclick事件应用
2013/02/02 Javascript
Extjs表单常见验证小结
2014/03/07 Javascript
javascript中clipboardData对象用法详解
2015/05/13 Javascript
JS实现网站菜单拖拽移位效果的方法
2015/09/24 Javascript
js事件冒泡与事件捕获详解
2017/02/20 Javascript
Bootstrap 3 按钮标签实例代码
2017/02/21 Javascript
详解从Node.js的child_process模块来学习父子进程之间的通信
2017/03/27 Javascript
每个 JavaScript 工程师都应懂的33个概念
2018/10/22 Javascript
JS代码触发事件代码实例
2020/01/02 Javascript
JS表格的动态操作完整示例
2020/01/13 Javascript
[52:02]DOTA2-DPC中国联赛 正赛 Phoenix vs Dragon BO3 第二场 2月26日
2021/03/11 DOTA
解决seaborn在pycharm中绘图不出图的问题
2018/05/24 Python
python统计字母、空格、数字等字符个数的实例
2018/06/29 Python
Python退火算法在高次方程的应用
2018/07/26 Python
使用Python的SymPy库解决数学运算问题的方法
2019/03/27 Python
python利用7z批量解压rar的实现
2019/08/07 Python
Python3实现zip分卷压缩过程解析
2019/10/09 Python
使用Tensorflow实现可视化中间层和卷积层
2020/01/24 Python
解决运行出现'dict' object has no attribute 'has_key'问题
2020/07/15 Python
详解python中GPU版本的opencv常用方法介绍
2020/07/24 Python
解决import tensorflow导致jupyter内核死亡的问题
2021/02/06 Python
园长自我鉴定
2013/10/06 职场文书
企业后勤岗位职责
2014/02/28 职场文书
社区居务公开实施方案
2014/03/27 职场文书
体育部部长竞选稿
2015/11/21 职场文书
关于销售人员的年终工作总结要点
2019/08/15 职场文书
Python中Permission denied的解决方案
2021/04/02 Python
解决persistence.xml配置文件修改存放路径的问题
2022/02/24 Java/Android