PHP中static关键字原理的学习研究分析

 更新时间:2011年07月18日 23:20:58   作者:  
PHP中static关键字原理的学习研究分析,学习php的朋友可以参考下。
看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转盘抽奖接口实例

    这篇文章主要介绍了PHP转盘抽奖接口的实现方法,实例分析了随机抽奖接口的实现原理与对应数据库操作的技巧,需要的朋友可以参考下
    2015-02-02
  • PHP根据文章内容生成关键词自动化Keywords标签

    PHP根据文章内容生成关键词自动化Keywords标签

    这篇文章主要为大家介绍了PHP根据文章内容生成关键词实现自动化Keywords标签实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • ThinkPHP安装和设置

    ThinkPHP安装和设置

    本文是ThinkPHP的系列教程的第一篇,本系列一共七篇,我们将从简到难,由浅入深,给大家详细介绍这款优秀的国产开源php框架,有需要的小伙伴可以关注下。
    2015-07-07
  • php在数据库抽象层简单使用PDO的方法

    php在数据库抽象层简单使用PDO的方法

    这篇文章主要介绍了php在数据库抽象层简单使用PDO的方法,以PDO针对数据库的连接、插入、查询等操作为例分析了PDO操作数据库的相关技巧,需要的朋友可以参考下
    2015-11-11
  • 使用PHPOffice/PHPWord实现读取Word内容

    使用PHPOffice/PHPWord实现读取Word内容

    这篇文章主要为大家详细介绍了如何使用PHPOffice/PHPWord实现读取Word内容的功能,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2023-07-07
  • 封装一个PDO数据库操作类代码

    封装一个PDO数据库操作类代码

    数据库PDO操作类,网上好多朋友需要的,可以参考下。
    2009-09-09
  • php操作excel文件 基于phpexcel

    php操作excel文件 基于phpexcel

    最近在工作中需要处理多语言的翻译问题,翻译都是写在excel表格里面。为了处理方便我就保留中文和英文两列。这样需要将这些数据从excel中取出来,然乎保存在excel的数组中,通过使用循环数组将相应的数据放入到数据库中。
    2010-07-07
  • 实现在同一方法中获取当前方法中新赋值的session值解决方法

    实现在同一方法中获取当前方法中新赋值的session值解决方法

    这篇文章主要介绍了在同一方法中获取当前方法中新赋值的session值解决方法,需要的朋友可以参考下
    2014-06-06
  • php+js实现裁剪任意形状图片

    php+js实现裁剪任意形状图片

    这篇文章主要为大家详细介绍了php+js实现裁剪任意形状图片,类似css mask,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-10-10
  • PHP中$GLOBALS[''HTTP_RAW_POST_DATA'']和$_POST的区别分析

    PHP中$GLOBALS[''HTTP_RAW_POST_DATA'']和$_POST的区别分析

    这篇文章主要介绍了PHP中$GLOBALS['HTTP_RAW_POST_DATA']和$_POST的区别,结合具体实例形式分析了$GLOBALS['HTTP_RAW_POST_DATA']和$_POST的功能与使用过程中的区别,需要的朋友可以参考下
    2017-07-07

最新评论