Discuz教程网

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

[复制链接]
authicon dly 发表于 2011-9-12 13:59:54 | 显示全部楼层 |阅读模式
看PHP手册的时候发现了下面这样一段代码:
代码如下:

  1. <?php
  2. function Test()
  3. {
  4. static $count = 0;
  5. $count++;
  6. echo $count;
  7. if ($count < 10) {
  8. Test();
  9. }
  10. $count--;
  11. }
  12. ?>
复制代码




执行结果如下:
这是一个递归的函数,声明的静态变量count记录次数,输出1~10。
我在看的时候有个疑惑,递归调用的时候 static $count = 0; 语句会重复执行,这为什么不会导致count变量被重复赋值呢?带着这个疑问和同事研究了一下,测试用代码如下:
代码如下:

  1. <?php
  2. echo 'start<br />';
  3. static $a = 10;
  4. echo "$a <br />";
  5. unset($GLOBALS['a']);
  6. echo "$a <br />";
  7. static $a = 20;
  8. echo "$a <br />";
  9. $GLOBALS['a'] = 10;
  10. echo "$a <br />";
  11. static $a = 30;
  12. echo "$a <br />";
  13. unset($GLOBALS['a']);
  14. echo "$a <br />";
  15. static $a;
  16. echo "$a <br />";
  17. static $a = 40;
  18. echo "$a <br />";
  19. $a = 100;
  20. echo "$a <br />";
  21. static $a = 50;
  22. echo "$a <br />";
  23. static $a = 4;
  24. echo "$a <br />";
  25. echo 'end <br />';
  26. exit;
  27. ?>
复制代码



执行结果如下:
start


    4 Notice: Undefined variable: a 4 10 10 Notice: Undefined variable: a 10 10 100 100 100
  • 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 URL验证正则表达式
下一篇:在WAMP环境下搭建ZendDebugger PHP调试工具的方法
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1314学习网 ( 浙ICP备10214163号 )

GMT+8, 2025-5-2 18:27

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表