+ -
当前位置:首页 → 问答吧 → PHP中static关键字原理的学习研究

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

时间:2011-07-19

来源:互联网

转:darkbluever

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




看PHP手册的时候发现了下面这样一段代码:
  1. 1 <?php2 function Test()3 {4 static $count = 0;5 6 $count++;7 echo $count;8 if ($count < 10) {9 Test();10 }11 $count--;12 }13 ?>
复制代码
执行结果如下:
12354678910
这是一个递归的函数,声明的静态变量count记录次数,输出1~10。
我在看的时候有个疑惑,递归调用的时候 static $count = 0; 语句会重复执行,这为什么不会导致count变量被重复赋值呢?带着这个疑问和同事研究了一下,测试用代码如下:
  1. 1 <?php2 echo 'start<br />';3 4 static $a = 10;5 echo "$a <br />";6 unset($GLOBALS['a']);7 echo "$a <br />";8 9 static $a = 20;10 echo "$a <br />";11 $GLOBALS['a'] = 10;12 echo "$a <br />";13 14 static $a = 30;15 echo "$a <br />";16 unset($GLOBALS['a']);17 echo "$a <br />";18 19 static $a;20 echo "$a <br />";21 22 static $a = 40;23 echo "$a <br />";24 $a = 100;25 echo "$a <br />";26 27 static $a = 50;28 echo "$a <br />";29 30 static $a = 4;31 echo "$a <br />";32 33 echo 'end <br />';34 35 exit;36 ?>
复制代码
执行结果如下:
  1. start
  2. 4  
  3. Notice: Undefined variable: a  
  4. 4  
  5. 10  
  6. 10  
  7. Notice: Undefined variable: a  
  8. 10  
  9. 10  
  10. 100  
  11. 100  
  12. 100  
  13. 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时成功停止。


可能有理解不正确的地方,欢迎拍砖。

作者: 凝望长空   发布时间: 2011-07-19

你还可以看看类的 static 属性和static 方法。 类似的。

作者: imbiss   发布时间: 2011-07-19

热门下载

更多