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的计数器程序
Oct 09 PHP
Zend Studio 无法启动的问题解决方法
Dec 04 PHP
PHP中的array数组类型分析说明
Jul 27 PHP
11个PHP 分页脚本推荐
Aug 15 PHP
Linux fgetcsv取得的数组元素为空字符串的解决方法
Nov 25 PHP
PHP中空字符串介绍0、null、empty和false之间的关系
Sep 25 PHP
PHP使用PDO连接ACCESS数据库
Mar 05 PHP
PHP+swoole实现简单多人在线聊天群发
Jan 19 PHP
php实现图片上传时添加文字和图片水印技巧
Apr 18 PHP
PHP解耦的三重境界(浅谈服务容器)
Mar 13 PHP
php读取XML的常见方法实例总结
Apr 25 PHP
PHP5.6读写excel表格文件操作示例
Feb 26 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
人族 Terran 基本策略
2020/03/14 星际争霸
PHP实现Socket服务器的代码
2008/04/03 PHP
ECMall支持SSL连接邮件服务器的配置方法详解
2014/05/19 PHP
学习PHP的数组总结【经验】
2016/05/05 PHP
PHP 记录访客的浏览信息方法
2018/01/29 PHP
JavaScript 对象成员的可见性说明
2009/10/16 Javascript
innerHTML与jquery里的html()区别介绍
2012/10/12 Javascript
Extjs grid添加一个图片状态或者按钮的方法
2014/04/03 Javascript
jQuery中innerWidth()方法用法实例
2015/01/19 Javascript
3个可以改善用户体验的AngularJS指令介绍
2015/06/18 Javascript
JS通过Cookie判断页面是否为首次打开
2016/02/05 Javascript
jquery实现手机端单店铺购物车结算删除功能
2017/02/22 Javascript
微信小程序 navbar实例详解
2017/05/11 Javascript
Vue之mixin全局的用法详解
2018/08/22 Javascript
详解Vue+Element的动态表单,动态表格(后端发送配置,前端动态生成)
2019/04/20 Javascript
js尾调用优化的实现
2019/05/23 Javascript
jQuery利用cookie 实现本地收藏功能(不重复无需多次命名)
2019/11/07 jQuery
JavaScript Event Loop相关原理解析
2020/06/10 Javascript
vue键盘事件点击事件加native操作
2020/07/27 Javascript
[47:52]DOTA2-DPC中国联赛正赛 iG vs LBZS BO3 第二场 3月4日
2021/03/11 DOTA
python单链表实现代码实例
2013/11/21 Python
Python中Django框架下的staticfiles使用简介
2015/05/30 Python
代码分析Python地图坐标转换
2018/02/08 Python
django框架模板中定义变量(set variable in django template)的方法分析
2019/06/24 Python
PyQt5 QTableView设置某一列不可编辑的方法
2019/06/25 Python
Python3之不使用第三方变量,实现交换两个变量的值
2019/06/26 Python
python 实现的发送邮件模板【普通邮件、带附件、带图片邮件】
2019/07/06 Python
分享CSS3制作卡片式图片的方法
2016/07/08 HTML / CSS
中国网上药店领导者:1药网
2017/02/16 全球购物
HomeAway的巴西品牌:Alugue Temporada
2018/04/10 全球购物
一道SQL面试题
2012/12/31 面试题
高二学年自我鉴定范文(2篇)
2014/09/26 职场文书
2014年小学德育工作总结
2014/12/05 职场文书
安全先进个人材料
2014/12/29 职场文书
sql时间段切分实现每隔x分钟出一份高速门架车流量
2022/02/28 SQL Server
Python与C++中梯度方向直方图的实现
2022/03/17 Python