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&amp;MYSQL服务器配置说明
Oct 09 PHP
php巧获服务器端信息
Dec 06 PHP
判断是否为指定长度内字符串的php函数
Feb 16 PHP
php+iframe实现隐藏无刷新上传文件
Feb 10 PHP
使用array mutisort 实现按某字段对数据排序
Jun 18 PHP
PHP基础知识介绍
Sep 17 PHP
php中switch与ifelse的效率区别及适用情况分析
Feb 12 PHP
PHP微信公众号自动发送红包API
Jun 01 PHP
利用php操作memcache缓存的基础方法示例
Aug 02 PHP
PHP实现基于PDO扩展连接PostgreSQL对象关系数据库示例
Mar 31 PHP
Yii Framework框架使用PHPExcel组件的方法示例
Jul 24 PHP
PHP+Redis链表解决高并发下商品超卖问题(实现原理及步骤)
Aug 03 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
用 PHP5 轻松解析 XML
2006/12/04 PHP
php开发环境配置记录
2011/01/14 PHP
PHP实现递归无限级分类
2015/10/22 PHP
PHP的Yii框架中行为的定义与绑定方法讲解
2016/03/18 PHP
ajax 同步请求和异步请求的差异分析
2011/07/04 Javascript
js opener的使用详解
2014/01/11 Javascript
$(document).ready(function() {})不执行初始化脚本
2014/06/19 Javascript
javascript 事件处理示例分享
2014/12/31 Javascript
javascript自动生成包含数字与字符的随机字符串
2015/02/09 Javascript
Window.Open打开窗体和if嵌套代码
2016/04/15 Javascript
基于原生JS实现图片裁剪
2016/08/01 Javascript
Extjs表单输入框异步校验的插件实现方法
2017/03/20 Javascript
详解在vue-cli中引用jQuery、bootstrap以及使用sass、less编写css
2017/11/08 jQuery
layui table设置某一行的字体颜色方法
2019/09/05 Javascript
vue keep-alive列表页缓存 详情页返回上一页不刷新,定位到之前位置
2019/11/26 Javascript
[55:04]海涛DOTA2死魂复燃6.82版本介绍
2014/09/28 DOTA
python zip文件 压缩
2008/12/24 Python
利用Python的Flask框架来构建一个简单的数字商品支付解决方案
2015/03/31 Python
在Python的Django框架中加载模版的方法
2015/07/16 Python
python实现按任意键继续执行程序
2016/12/30 Python
详解Python中类的定义与使用
2017/04/11 Python
Python+matplotlib实现华丽的文本框演示代码
2018/01/22 Python
pandas 空的dataframe 插入列名的示例
2018/10/30 Python
Python中单线程、多线程和多进程的效率对比实验实例
2019/05/14 Python
python+mysql实现个人论文管理系统
2019/10/25 Python
Python ArgumentParse的subparser用法说明
2020/04/20 Python
澳大利亚婴儿礼品公司:The Baby Gift Company
2018/11/04 全球购物
澳大利亚在线购买葡萄酒:The Wine Collective
2020/02/20 全球购物
WebSphere面试题:在WebSphere里面如何部署一个应用
2015/08/02 面试题
自我鉴定200字
2013/10/28 职场文书
大堂副理的岗位职责范文
2014/02/17 职场文书
以幸福为主题的活动方案
2014/08/22 职场文书
三孔导游词
2015/02/05 职场文书
2015大学迎新晚会主持词
2015/07/16 职场文书
Python学习开发之图形用户界面详解
2021/08/23 Python
Python+OpenCV实现图片中的圆形检测
2022/04/07 Python