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显示MySQL数据的三种方法
Jun 05 PHP
基于AppServ,XAMPP,WAMP配置php.ini去掉警告信息(NOTICE)的方法详解
May 07 PHP
利用curl抓取远程页面内容的示例代码
Jul 23 PHP
php多文件上传下载示例分享
Feb 20 PHP
ThinkPHP CURD方法之order方法详解
Jun 18 PHP
PHP图片处理之使用imagecopy函数添加图片水印实例
Nov 19 PHP
Laravel5中contracts详解
Mar 02 PHP
php通过array_merge()函数合并关联和非关联数组的方法
Mar 18 PHP
学习php设计模式 php实现适配器模式
Dec 07 PHP
ThinkPHP中where()使用方法详解
Apr 19 PHP
thinkphp验证码的实现(form、ajax实现验证)
Jul 28 PHP
PHP常用工具函数小结【移除XSS攻击、UTF8与GBK编码转换等】
Apr 27 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发电子邮件
2006/10/09 PHP
php中chdir()函数用法实例
2014/11/13 PHP
php实现发送微信模板消息的方法
2015/03/07 PHP
PHP使用Pthread实现的多线程操作实例
2015/11/14 PHP
php执行多个存储过程的方法【基于thinkPHP】
2016/11/08 PHP
php微信公众平台示例代码分析(二)
2016/12/06 PHP
PHP7扩展开发教程之Hello World实现方法示例
2017/08/03 PHP
JavaScript多线程的实现方法
2007/05/08 Javascript
niceTitle 基于jquery的超链接提示插件
2010/05/31 Javascript
javascript代码运行不出来执行错误的可能情况整理
2013/10/18 Javascript
jQuery选择器querySelector的使用指南
2015/01/23 Javascript
JavaScript 继承详解(六)
2016/10/11 Javascript
JS实现字符串转驼峰格式的方法
2016/12/16 Javascript
jquery submit()不能提交表单的解决方法
2017/04/24 jQuery
详解微信小程序Radio选中样式切换
2017/07/06 Javascript
利用C/C++编写node.js原生模块的方法教程
2017/07/07 Javascript
nodejs中request库使用HTTPS代理的方法
2019/04/30 NodeJs
详解wepy开发小程序踩过的坑(小结)
2019/05/22 Javascript
JS造成内存泄漏的几种情况实例分析
2020/03/02 Javascript
OpenLayer3自定义测量控件MeasureTool
2020/09/28 Javascript
[32:26]EG vs IG 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
[51:26]VP vs VG 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
python 实现插入排序算法
2012/06/05 Python
python中for语句简单遍历数据的方法
2015/05/07 Python
python 拷贝特定后缀名文件,并保留原始目录结构的实例
2018/04/27 Python
Django页面数据的缓存与使用的具体方法
2019/04/23 Python
详细介绍pandas的DataFrame的append方法使用
2019/07/31 Python
Python数据持久化存储实现方法分析
2019/12/21 Python
结束运行python的方法
2020/06/16 Python
美国本地交易和折扣网站:LocalFlavor.com
2017/10/26 全球购物
外科实习自我鉴定
2013/10/06 职场文书
求职推荐信
2013/10/28 职场文书
离婚起诉书范本
2015/05/18 职场文书
Python基于百度API识别并提取图片中文字
2021/06/27 Python
实操Python爬取觅知网素材图片示例
2021/11/27 Python
Python pyecharts案例超市4年数据可视化分析
2022/08/14 Python