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 中dirname(_file_)讲解
Mar 18 PHP
PHP5中Cookie与 Session使用详解
Apr 30 PHP
浅析关于PHP位运算的简单权限设计
Jun 30 PHP
php实现cc攻击防御和防止快速刷新页面示例
Feb 13 PHP
PHP实现获取图片颜色值的方法
Jul 11 PHP
mac环境中使用brew安装php5.5.15
Aug 18 PHP
完美解决thinkphp验证码出错无法显示的方法
Dec 09 PHP
PHP连接MySQL数据的操作要点
Mar 20 PHP
关于php微信订阅号开发之token验证后自动发送消息给订阅号但是没有消息返回的问题
Dec 21 PHP
PHP文件上传问题汇总(文件大小检测、大文件上传处理)
Dec 24 PHP
Laravel中间件实现原理详解
Oct 09 PHP
PHP编程获取音频文件时长的方法【基于getid3类】
Apr 20 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
SONY ICF-SW7600的电路分析
2021/03/02 无线电
PHP中str_replace函数使用小结
2008/10/11 PHP
深入php var_dump()函数的详解
2013/06/05 PHP
php计算两个日期时间差(返回年、月、日)
2014/06/19 PHP
PHP函数实现从一个文本字符串中提取关键字的方法
2015/07/01 PHP
php冒泡排序与快速排序实例详解
2015/12/07 PHP
PHP生成图片缩略图类示例
2017/01/12 PHP
javascript入门·图片对象(无刷新变换图片)\滚动图像
2007/10/01 Javascript
JavaScript 替换Html标签实现代码
2009/10/14 Javascript
JS实现选项卡实例详解
2015/11/17 Javascript
Node.js connect ECONNREFUSED错误解决办法
2016/09/15 Javascript
BootStrap tab选项卡使用小结
2020/08/09 Javascript
AngularJS ng-repeat指令及Ajax的应用实例分析
2017/07/06 Javascript
详解基于Vue+Koa的pm2配置
2017/10/24 Javascript
jQuery实现ajax回调函数带入参数的方法示例
2018/06/26 jQuery
判断文字超过2行添加展开按钮,未超过则不显示,溢出部分显示省略号
2019/04/28 Javascript
python类继承用法实例分析
2014/10/10 Python
简单介绍Python中用于求最小值的min()方法
2015/05/15 Python
python实现飞机大战
2018/09/11 Python
python斐波那契数列的计算方法
2018/09/27 Python
python try except 捕获所有异常的实例
2018/10/18 Python
Pytorch卷积层手动初始化权值的实例
2019/08/17 Python
python 上下文管理器及自定义原理解析
2019/11/19 Python
python判断链表是否有环的实例代码
2020/01/31 Python
自定义Django Form中choicefield下拉菜单选取数据库内容实例
2020/03/13 Python
目前不被任何主流浏览器支持的CSS3属性汇总
2014/07/21 HTML / CSS
老板电器官方购物商城:老板油烟机、燃气灶、消毒柜、电烤箱
2018/05/30 全球购物
医学生自荐信
2013/12/03 职场文书
主持人演讲稿
2014/05/13 职场文书
2014年督导工作总结
2014/11/19 职场文书
大学生个人学习总结
2015/02/15 职场文书
业务员管理制度范本
2015/08/06 职场文书
安全教育主题班会总结
2015/08/14 职场文书
2016企业先进集体事迹材料
2016/02/25 职场文书
《自然之道》读后感3篇
2019/12/17 职场文书
vue使用Google Recaptcha验证的实现示例
2021/08/23 Vue.js