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 相关文章推荐
来自phpguru得Php Cache类源码
Apr 15 PHP
php使用百度翻译api示例分享
Jan 31 PHP
php操作mysql数据库的基本类代码
Feb 25 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十六)
Jun 30 PHP
PHP实现JS中escape与unescape的方法
Jul 11 PHP
php使用ftp远程上传文件类(完美解决主从文件同步问题的方法)
Sep 23 PHP
php获取服务器操作系统相关信息的方法
Oct 08 PHP
php图像处理函数imagecopyresampled用法详解
Dec 02 PHP
php爬取天猫和淘宝商品数据
Feb 23 PHP
yii2多图上传组件的使用教程
May 10 PHP
PHP数据对象映射模式实例分析
Mar 29 PHP
PHP开发的文字水印,缩略图,图片水印实现类与用法示例
Apr 12 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微框架Dispatch简介
2014/06/12 PHP
php使用FFmpeg接口获取视频的播放时长、码率、缩略图以及创建时间
2016/11/07 PHP
php使用scandir()函数扫描指定目录下所有文件示例
2019/06/08 PHP
jquery 图片Silhouette Fadeins渐显效果
2010/02/07 Javascript
基于jquery的滚动新闻列表
2010/06/19 Javascript
Pro JavaScript Techniques学习笔记
2010/12/28 Javascript
js使下拉列表框可编辑不止是选择
2013/12/12 Javascript
JS实现根据出生年月计算年龄
2014/01/10 Javascript
extjs每个组件要设置唯一的ID否则会出错
2014/06/15 Javascript
js的touch事件的实际引用
2014/10/13 Javascript
纯javascript模仿微信打飞机小游戏
2015/08/20 Javascript
简单了解Backbone.js的Model模型以及View视图的源码
2016/02/14 Javascript
JavaScript实现显示函数调用堆栈的方法
2016/04/21 Javascript
js操作DOM--添加、删除节点的简单实例
2016/07/08 Javascript
浅析BootStrap中Modal(模态框)使用心得
2016/12/24 Javascript
鼠标点击input,显示瞬间的边框颜色,对之修改与隐藏实例
2016/12/26 Javascript
基于jQuery实现弹幕APP
2017/02/10 Javascript
vue+springmvc导出excel数据的实现代码
2018/06/27 Javascript
微信小程序实现循环动画效果
2018/07/16 Javascript
vue props传值失败 输出undefined的解决方法
2018/09/11 Javascript
Python打造出适合自己的定制化Eclipse IDE
2016/03/02 Python
Python实现的当前时间多加一天、一小时、一分钟操作示例
2018/05/21 Python
解决vscode python print 输出窗口中文乱码的问题
2018/12/03 Python
Python异常原理及异常捕捉实现过程解析
2020/03/25 Python
python和node.js生成当前时间戳的示例
2020/09/29 Python
Python爬虫之Selenium中frame/iframe表单嵌套页面
2020/12/04 Python
英国在线房屋中介网站:Yopa
2018/01/09 全球购物
美国葡萄酒网上商店:Martha Stewart Wine Co.
2019/03/17 全球购物
什么是属性访问器
2015/10/26 面试题
世博会口号
2014/06/20 职场文书
语文教育专业求职信
2014/06/28 职场文书
意外伤害赔偿协议书
2014/09/16 职场文书
领导干部“四风”问题批评与自我批评材料
2014/09/24 职场文书
防汛工作情况汇报
2014/10/28 职场文书
JS数组方法some、every和find的使用详情
2021/10/05 Javascript
科普 | 业余无线电知识-波段篇
2022/02/18 无线电