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中$_SERVER[PHP_SELF] 和 $_SERVER[SCRIPT_NAME]之间的区别
Sep 05 PHP
PHP中strtotime函数使用方法分享
Jan 10 PHP
Linux Apache PHP Oracle 安装配置(具体操作步骤)
Jun 17 PHP
PHP使用strtotime计算两个给定日期之间天数的方法
Mar 18 PHP
php实现zip文件解压操作
Nov 03 PHP
Yii框架中jquery表单验证插件用法示例
Oct 18 PHP
php array_merge_recursive 数组合并
Oct 26 PHP
PHP中ajax无刷新上传图片与图片下载功能
Feb 21 PHP
Yii2中添加全局函数的方法分析
May 04 PHP
yii2 resetful 授权验证详解
May 18 PHP
PHP自动识别当前使用移动终端
May 21 PHP
PHP的mysqli_thread_id()函数讲解
Jan 24 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/03 日漫
php中cookie的作用域
2008/03/27 PHP
PHP使用ODBC连接数据库的方法
2015/07/18 PHP
Laravel框架自定义公共函数的引入操作示例
2019/04/16 PHP
一个无限级XML绑定跨框架菜单(For IE)
2007/01/27 Javascript
jQuery中empty()方法用法实例
2015/01/16 Javascript
AngularJS内置指令
2015/02/04 Javascript
深入理解JavaScript编程中的原型概念
2015/06/25 Javascript
jQuery实现鼠标滑向当前图片高亮显示并且其它图片变灰的方法
2015/07/27 Javascript
js如何实现淡入淡出效果
2020/11/18 Javascript
window.setInterval()方法的定义和用法及offsetLeft与style.left的区别
2015/11/11 Javascript
javascript移动开发中touch触摸事件详解
2016/03/18 Javascript
AngularJS删除路由中的#符号的方法
2016/09/20 Javascript
如何用js判断dom是否有存在某class的值
2017/02/13 Javascript
vue数据传递--我有特殊的实现技巧
2018/03/20 Javascript
解决vue项目中type=”file“ change事件只执行一次的问题
2018/05/16 Javascript
在Vant的基础上实现添加表单验证框架的方法示例
2018/12/05 Javascript
原生js实现密码强度验证功能
2020/03/18 Javascript
token 机制和实现方式
2020/12/15 Javascript
[00:12]DAC SOLO赛卫冕冠军 VG.Paparazi灬展现SOLO技巧
2018/04/06 DOTA
详解Python的Django框架中的templates设置
2015/05/11 Python
Python操作列表之List.insert()方法的使用
2015/05/20 Python
Fabric 应用案例
2016/08/28 Python
Python中join函数简单代码示例
2018/01/09 Python
Python paramiko模块的使用示例
2018/04/11 Python
详解pandas如何去掉、过滤数据集中的某些值或者某些行?
2019/05/15 Python
Python爬虫实现使用beautifulSoup4爬取名言网功能案例
2019/09/15 Python
VICHY薇姿俄罗斯官方网上商店:法国护肤品牌,火山温泉水
2019/11/22 全球购物
中专药剂专业应届毕的自我评价
2013/12/27 职场文书
门诊手术室工作制度
2014/01/30 职场文书
环保建议书作文
2014/03/12 职场文书
党校培训自我鉴定范文
2014/04/10 职场文书
医学生求职自荐书
2014/06/12 职场文书
小学课外活动总结
2014/07/09 职场文书
学校百日安全活动总结
2015/05/07 职场文书
Spring Boot 排除某个类加载注入IOC的操作
2021/08/02 Java/Android