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 相关文章推荐
生成ubuntu自动切换壁纸xml文件的php代码
Jul 17 PHP
php 读取文件头判断文件类型的实现代码
Aug 05 PHP
新手菜鸟必读:session与cookie的区别
Aug 22 PHP
php遍历文件夹下的所有文件和子文件夹示例
Mar 20 PHP
php强制文件下载而非在浏览器打开的自定义函数分享
May 08 PHP
php调用淘宝开放API实现根据卖家昵称获取卖家店铺ID的方法
Jul 29 PHP
php防止用户重复提交表单
Nov 02 PHP
php+ajax实现无刷新数据分页的办法
Nov 02 PHP
Yii2使用swiftmailer发送邮件的方法
May 03 PHP
PHP使用strrev翻转中文乱码问题的解决方法
Jan 13 PHP
laravel框架路由分组,中间件,命名空间,子域名,路由前缀实例分析
Feb 18 PHP
TP5多入口设置实例讲解
Dec 15 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
77A一级收信机修理记
2021/03/02 无线电
php 文本文件的读取效率
2012/02/10 PHP
php将HTML表格每行每列转为数组实现采集表格数据的方法
2015/04/03 PHP
PHP基于swoole多进程操作示例
2019/08/12 PHP
JavaScript 异步调用框架 (Part 6 - 实例 &amp; 模式)
2009/08/04 Javascript
js 小贴士一星期合集
2010/04/07 Javascript
基于jQuery的星级评分插件
2011/08/12 Javascript
Javascript学习笔记之 函数篇(二) : this 的工作机制
2014/06/24 Javascript
仿淘宝TAB切换搜索框搜索切换的相关内容
2014/09/21 Javascript
JavaScript异步上传图片文件的实例代码
2017/07/04 Javascript
AngularJS实现页面跳转后自动弹出对话框实例代码
2017/08/02 Javascript
jQuery图片缩放插件smartZoom使用实例详解
2017/08/25 jQuery
jquery点击回车键实现登录效果并默认焦点的方法
2018/03/09 jQuery
AngularJS与BootStrap模仿百度分页的示例代码
2018/05/23 Javascript
对vuejs的v-for遍历、v-bind动态改变值、v-if进行判断的实例讲解
2018/08/27 Javascript
一些你可能不熟悉的JS知识点总结
2019/03/15 Javascript
微信小程序使用wx.request请求服务器json数据并渲染到页面操作示例
2019/03/30 Javascript
Electron 调用命令行(cmd)
2019/09/23 Javascript
jQuery弹框插件使用方法详解
2020/05/26 jQuery
vue封装自定义指令之动态显示title操作(溢出显示,不溢出不显示)
2020/11/12 Javascript
在python中的socket模块使用代理实例
2014/05/29 Python
Sanic框架配置操作分析
2018/07/17 Python
Python中print和return的作用及区别解析
2019/05/05 Python
django 微信网页授权登陆的实现
2019/07/30 Python
用python生成与调用cntk模型代码演示方法
2019/08/26 Python
Pandas之缺失数据的实现
2021/01/06 Python
计算机应用专业推荐信
2013/11/13 职场文书
国贸类专业毕业生的求职信分享
2013/12/08 职场文书
大学军训通讯稿
2014/01/13 职场文书
爱国演讲稿400字
2014/05/07 职场文书
爱护公共设施的标语
2014/06/24 职场文书
安全资料员岗位职责范本
2014/06/28 职场文书
思想纪律作风整顿剖析材料
2014/10/11 职场文书
财政局党的群众路线教育实践活动剖析材料
2014/10/13 职场文书
2015初中团委工作总结
2015/07/28 职场文书
MutationObserver在页面水印实现起到的作用详解
2022/07/07 Javascript