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析构函数的简单使用说明

    与构造函数相反,在PHP5中,可以定义一个名为__destruct()的函数,称之为PHP5析构函数,PHP将在对象在内存中被销毁前调用析构函数,使对象在彻底消失之前完成一些工作。对象在销毁一般可以通过赋值为null实现。
    2015-08-08
  • PHP实现的加密解密处理类

    PHP实现的加密解密处理类

    这篇文章主要介绍了PHP实现的加密解密处理类,结合实例形式分析了php加密解密类的定义与使用技巧,需要的朋友可以参考下
    2016-05-05
  • PHP开发不能违背的安全规则 过滤用户输入

    PHP开发不能违背的安全规则 过滤用户输入

    作为PHP程序员,特别是新手,对于互联网的险恶总是知道的太少,对于外部的入侵有很多时候是素手无策的,他们根本不知道黑客是如何入侵的、提交入侵、上传漏洞、sql 注入、跨脚本攻击等等。
    2011-05-05
  • PHP数据流应用的一个简单实例

    PHP数据流应用的一个简单实例

    PHP数据流应用的一个简单实例代码,需要的朋友可以参考下
    2012-09-09
  • PHP遍历数组的三种方法及效率对比分析

    PHP遍历数组的三种方法及效率对比分析

    这篇文章主要介绍了PHP遍历数组的三种方法及效率对比,实例分析了foreach、while与for三种遍历数组的方法与相关的效率比对,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-02-02
  • PHP进阶学习之依赖注入与Ioc容器详解

    PHP进阶学习之依赖注入与Ioc容器详解

    这篇文章主要介绍了PHP进阶学习之依赖注入与Ioc容器,结合实例形式详细分析了依赖注入与Ioc容器概念、原理、用法及相关操作注意事项,需要的朋友可以参考下
    2019-06-06
  • apache php模块整合操作指南

    apache php模块整合操作指南

    本文将详细介绍Linux下Apache、php3、MySQL的整合的相关问题的解决方法,需要的朋友可以参考下
    2012-11-11
  • 计算php页面运行时间的函数介绍

    计算php页面运行时间的函数介绍

    本篇文章是对计算php页面运行时间的函数进行了详细的分析介绍,需要的朋友参考下
    2013-07-07
  • Yii框架调试心得--在页面输出执行sql语句

    Yii框架调试心得--在页面输出执行sql语句

    这篇文章主要介绍了Yii框架调试心得--在页面输出执行sql语句,需要的朋友可以参考下
    2014-12-12
  • PHP如何实现防止重复提交

    PHP如何实现防止重复提交

    防抖(Debounce)是一种防止重复提交的策略,它通过延迟一定时间来合并连续的操作,以确保只执行一次,本文为大家整理了几种防抖的实现方法,希望对大家有所帮助
    2023-09-09

最新评论