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&amp;java(三)
Oct 09 PHP
追求程序速度,而不是编程的速度
Apr 23 PHP
PHP中使用CURL伪造来路抓取页面或文件
May 04 PHP
9个PHP开发常用功能函数小结
Jul 15 PHP
php中取得文件的后缀名?
Feb 20 PHP
无需重新编译php加入ftp扩展的解决方法
Feb 07 PHP
非常实用的PHP常用函数汇总
Dec 17 PHP
PHP实现即时输出、实时输出内容方法
May 27 PHP
PHP使用自定义方法实现数组合并示例
Jul 07 PHP
PHP explode()函数用法讲解
Feb 15 PHP
PHP7 安装event扩展的实现方法
Oct 08 PHP
Yii中特殊行为ActionFilter的使用方法示例
Oct 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
雄兵连:天使彦天使彦为爱折翼,彦和炙心同时念动的誓言!
2020/03/02 国漫
一贴学会PHP 新手入门教程
2009/08/03 PHP
PHP字符过滤函数去除字符串最后一个逗号(rtrim)
2013/03/26 PHP
在Windows系统下使用PHP生成Word文档的教程
2015/07/03 PHP
CMSPRESS 10行代码搞定 PHP无限级分类2
2018/03/30 PHP
jquery 1.4.2发布!主要是性能与API
2010/02/25 Javascript
JavaScript 判断日期格式是否正确的实现代码
2011/07/04 Javascript
更换select下拉菜单背景样式的实现代码
2011/12/20 Javascript
取得元素的左和上偏移量的方法
2014/09/17 Javascript
javascript实现在网页任意处点左键弹出隐藏菜单的方法
2015/05/13 Javascript
SublimeText自带格式化代码功能之reindent
2015/12/27 Javascript
Vue.js每天必学之内部响应式原理探究
2016/09/07 Javascript
Bootstrap 模态框(Modal)插件代码解析
2016/12/21 Javascript
基于three.js编写的一个项目类示例代码
2018/01/05 Javascript
JS表单传值和URL编码转换
2018/03/03 Javascript
vue axios 在页面切换时中断请求方法 ajax
2018/03/05 Javascript
浅谈微信小程序flex布局基础
2018/09/10 Javascript
Vuex的基本概念、项目搭建以及入坑点
2018/11/04 Javascript
详解js中let与var声明变量的区别
2020/04/05 Javascript
node中实现删除目录的几种方法
2019/06/24 Javascript
关于vue2强制刷新,解决页面不会重新渲染的问题
2019/10/29 Javascript
vue-model实现简易计算器
2020/08/17 Javascript
使用Node.js和Socket.IO扩展Django的实时处理功能
2015/04/20 Python
python简单判断序列是否为空的方法
2015/06/30 Python
python中reduce()函数的使用方法示例
2017/09/29 Python
使用python执行shell脚本 并动态传参 及subprocess的使用详解
2020/03/06 Python
用css3实现当鼠标移进去时当前亮其他变灰效果
2014/04/08 HTML / CSS
CSS3 animation实现逐帧动画效果
2016/06/02 HTML / CSS
HTML5 video标签(播放器)学习笔记(一):使用入门
2015/04/24 HTML / CSS
英国领先的在线高尔夫商店:Scottsdale Golf
2019/08/26 全球购物
医学院护理专业应届生求职信
2013/11/12 职场文书
教师求职推荐信范文
2013/11/20 职场文书
品质标语大全
2014/06/21 职场文书
教师自查自纠材料
2014/10/14 职场文书
2016年基层党组织创先争优承诺书
2016/03/25 职场文书
中国古代史学名著《战国策》概述
2019/08/09 职场文书